1. 程式人生 > 其它 >x264的位元速率控制

x264的位元速率控制

技術標籤:音視訊編解碼x264

位元速率控制基本概念

位元速率控制是指視訊編碼中決定輸出位元速率的過程。首先介紹一下 X264 中使用到的與位元速率控制相關的幾個概念:

CQP(Constant QP) 恆 定QP(Quantization Parameter),追求量化失真的恆定,瞬時位元速率會隨場景 複雜度而波動,該模式基本被淘汰(被 CRF 取代),只有用”-pq 0”來進行無損編碼還有價值。

CRF(Constant Rate Factor),恆定質量因子,與恆定 QP 類似,但追求主觀感知到的質量恆定,瞬時位元速率也 會隨場景複雜度波動。對於快速運動或細節豐富的場景會適當增大量化失真(因為人眼不易注意到),反之 對於靜止或平坦區域則減少量化失真。

ABR(Average Bitrate),平均位元速率,追求整個檔案的位元速率平均達到指定值(對於流媒體有何特殊之處?)。 瞬時位元速率也會隨著場景複雜度波動,但最終要受平均值的約束。

CBR(Constant Bitrate),恆定位元速率。前面幾個模式都屬於可變位元速率(瞬時位元速率在波動),即VBR(Variable Bitrate); 恆定位元速率與之相對,即位元速率保持不變。

x264 並沒有直接提供 CBR 這種模式,但可以通過在 VBR 模式的基礎上做進一步限制來達到恆定位元速率的目標。 CRF 和 ABR 模式都能通過–vbv-maxrate --vbv-bufsize來限制位元速率波動。

關於這幾個概念的參考如下:
1.Waht are CBR,VBV and CPB?
2.FFmpeg and H.264 Encoding Guide
3.CRF Guide(Constant Rate Factor in X264 and X265)
4.MeGUI/x264 setting

X264 中位元速率控制

X264 中對於位元速率控制方法有三種:X264_RC_CQP、X264_RC_CRF、X264_RC_ABR。預設情況是選擇 CRF 方法,設定是在 x264_param_default函式裡設定的

param->rc.i_rc_method = X264_RC_CRF;
param->rc.f_rf_constant = 23;

關於這三種方法,網上有提到優先順序是ABR>CQP>CRF的,但分析 X264 的原始碼,並沒有看出有優先順序順序,關於位元速率控制方法的設定程式碼如下:

OPT("bitrate")
{
    p->rc.i_bitrate = atoi(value);
    p->rc.i_rc_method = X264_RC_ABR;
}
OPT2("qp", "qp_constant")
{
    p->rc.i_qp_constant = atoi(value);
    p->rc.i_rc_method = X264_RC_CQP;
}
OPT("crf")
{
    p->rc.f_rf_constant = atof(value);
    p->rc.i_rc_method = X264_RC_CRF;
}

X264 中關於 QP

首先看一段 X264 中關於 QP 值的程式碼,該段程式碼在x264_ratecontrol_new:

rc->ip_offset = 6.0 * log2f(h->param.rc.f_ip_factor);
rc->pb_offset = 6.0 * log2f(h->param.rc.f_pb_factor);
rc->qp_constant[SLICE_TYPE_P] = h->param.rc.i_qp_constant;
rc->qp_constant[SLICE_TYPE_I] = x264_clip3(h->param.rc.i_qp_constant - rc->ip_offset + 0.5, 0, QP_MAX);
rc->qp_constant[SLICE_TYPE_B] = x264_clip3(h->param.rc.i_qp_constant + rc->pb_offset + 0.5, 0, QP_MAX);

從上面的程式碼可以看出,預設的i_qp_constant或者通過命令列傳入的qp qp_constant實際設定的是 P 幀的 QP。 I 幀和 B 幀的 QP 設定是根據f_ip_factor f_pb_factor計算得到。

在研究編碼演算法的時候,一般會選用 CQP 方法,設定 QP 為 24、28、32、36、40等(一般選 4 個 QP 值),然後比較演算法優劣。 在 X264 中,關於QPmin、QPmax、QPstep的預設設定如下:

param->rc.i_qp_min = 0;
param->rc.i_qp_max = QP_MAX;
param->rc.i_qp_step = 4;

QPmin,預設值:0.定義 X264 可以使用的最小量化值,量化值越小,輸出視訊質量越好。當 QP 小於某一個值後, 編碼輸出的巨集塊質量與原始塊極為相近,此時沒必要繼續降低 QP。如果開啟了自適應量化器(預設開啟),不建議 提高 QPmin 的值,因為這會降低平滑背景區域的視覺質量。

QPmax,預設值:51.定義 X264 可以使用的最大量化值。預設值 51 是 H.264 規格中可供使用的最大量化值。如果 想要控制 X264 輸出的最低品質,可以將此值設定的小一些。QPmin 和 QPmax 在CRF,ABR方法下是有效的,過低的設定 QPmax,可能造成 ABR 位元速率控制失敗。不建議調整該引數。

QPstep,預設值:4.設定兩幀間量化值的最大變化幅度。

幀間 QP 變化,幀內巨集塊 QP 不變,輸出位元速率未知,各幀輸出視覺質量有變化(高 QP 底位元速率的情況下會更明顯)。

.
比較三種位元速率控制方式如下:

位元速率控制方法視覺質量穩定性即時輸出位元速率輸出檔案大小
CBR不穩定恆定可控
VBR穩定變化不可控
ABR基本穩定變化可控

轉自: http://lazybing.github.io/blog/2017/07/15/x264-rake-control/

參考
https://www.codenong.com/cs105537758/

補充:

低延遲

x264提供了一個 -tune zerolatency 選項。

strcpy(parameter_preset,  "veryfast"  );  
strcpy(parameter_tune, "zerolatency"  );  
x264_param_default_preset(x264_parameter,   "veryfast" , "zerolatency"  );

如果你想讓你的視訊最大化的和目標播放裝置相容(比如老版本的的ios或者所有的android 裝置),那麼你可以這做:
-profile:v baseline

x264_param_apply_profile(x264_parameter,  "baseline")

掃碼關注 【音視訊開發訓練營】公眾號
在這裡插入圖片描述