轉自:http://www.bubuko.com/infodetail-471698.html
1. X264顯式支持的一趟碼率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。這三種方式的優先級是ABR > CQP > CRF.
if ( bitrate ) rc_method = ABR;
else if ( qp || qp_constant ) rc_method = CQP;
else rc_method = CRF;
bitrate和QP都沒有缺省值,一旦設置他們就表示要按照相應的碼率控制方法進行編碼,CRF有缺省值23,沒有任何關於編碼控制的設置時就按照CRF缺省值23來編碼。
一般的使用建議:
CQP – not recommended anymore unless you know you want it
CRF – good for one pass when the priority is quality and file size/bit rate is not really a concern
1 pass ABR – good for streaming purposes or targeting a bit rate when two-pass is unfeasible
2 pass VBR – good for targeting a bit rate when you have the time to spend on two passes (though the first pass can be quite fast) and are writing to a file
2. CQP,恆定QP. 無缺省值
最簡單的碼率控制方式,每幀圖像都按照一個特定的QP來編碼,每幀編碼后的數據量有多大是未知的。
參數qp_constant設置的是P幀的QP。I,B幀的QP根據f_ip_factor, f_pb_factor,計算得到。
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 );
連續多個B幀時,QP會漸增。
x264 YUV420格式 8比特采樣的QP范圍是[0, 51]。QP值越小,編碼視覺質量越好。QP=0為無失真編碼。
在研究編碼算法的時候,一般會選用CQP方法,設定QP為24,28,32,36,40等(一般選4個QP值),編碼得到RD曲線,然后比較算法優劣。
相同視覺質量時,CQP編碼輸出的文件會比CRF模式更大。一般而言CRF都能代替CQP方法,不過CQP因為完全不需要預測所以它會運行得更快一些。
幀的重要級別為:IDR幀 > I幀 > P幀 > 做參考的B幀 > 不做參考的B幀。QP可以依次增大。
qpmin,默認值: 0。定義X264可以使用的最小量化值。量化值越小,輸出視頻質量就越好。
當QP小於某一個值后,編碼輸出的宏塊質量與原始塊極為相近,這時沒必要繼續降低QP。
如果開啟了自適應量化器(默認開啟),不建議提高qpmin的值,因為這會降低平滑背景區域的視覺質量。
qpmax,默認值: 51。定義X264可以使用的最大量化值。默認值51是H.264規格中可供使用的最大量化值。
如果想要控制X264輸出的最低品質,可以將此值設置的小一些。
QPmin和QPmax在CRF,ABR方法下是有效的,過低的設置QPmax,可能造成ABR碼率控制失敗。不建議調整這個參數。
qpstep,默認值: 4。設置兩幀間量化值的最大變化幅度。
幀間QP變化,幀內宏塊QP不變,輸出碼率未知,各幀輸出視覺質量有變化(高QP低碼率的情況下會更明顯)。
3. CRF,恆定Rate Factor (碼率系數)缺省值23
CQP是把某個量化值作為目標,bitrate是把某個輸出文件大小作為目標,而CRF則是把某個輸出“視覺質量”作為目標。
CRF可以提供跟QP一樣的視覺質量,但是文件更小,CRF是通過降低那些“less important”幀的質量來達到此目的的。
“less important”的意思是那些過於耗費碼率又難以用肉眼察覺的幀,比如復雜或者高速運行的場景。省下來的碼率會分配給其它更有效的幀。
在X264編碼器內部CRF和bitrate采用了相同的調整策略,只是它不遵循一個特定的輸出碼率。
它也是通過改變不同重要級別幀(I,P,B類型),以及幀內不同宏塊類型(高速運動,復雜紋理,平坦區域)的QP值,以此來調整輸出視覺質量。
和QP的范圍一樣RF的范圍也是[0, 51]。其中0為無損模式,23為缺省,51質量最差。和QP一樣的趨勢。RF值加6,輸出碼率大概減少一半;減6,輸出碼率翻倍。
從主觀上講,18~28是一個合理的范圍,18往往被認為從視覺上看是近似無損的。
幀間QP變化,幀內宏塊QP變化,輸出碼率未知,各幀輸出視覺質量基本恆定。
4. ABR, 恆定平均目標碼率。想要選擇這種碼率控制方法,必須先設置bitrate。
X264中bitrate的單位是Kbps(K bit per sec). --bitrate 128指的是設置目標碼率為128Kbps, 這樣一秒鍾的數據量為 128/8比特 = 16K字節。
如果輸入為352x288@15fps,相當於128Kbit/(352*288*15) = 0.086比特每像素。編碼后每個像素平均分配不到0.1個比特。
與ABR相應的技術有CBR,VBR。這些碼率控制技術首先都是在音頻編碼中采用,是解決音頻編碼采用什么樣的比特率最優的問題。
CBR編碼碼比特率基本保持恆定在目標比特率,有利於流式播放。
CBR的缺點在於復雜場景碼率不夠用,簡單場景碼率浪費,因此編碼內容的視覺質量不穩定。通常在較低比特率下,這種質量的變化會更加明顯。
VBR編碼為簡單場景分配較大的QP,為復雜的場景分配較小的QP,得到基本穩定的輸出視覺質量。
相對於CBR,在相同文件大小的條件下,VBR的輸出結果要比CBR好的多,這有利於媒體下載和本地存儲。
VBR的缺點在於輸出碼流大小不可控。同時對於復雜度恆定的內容(例如新聞播音)沒什么優勢。
ABR編碼為簡單場景分配較少的比特,從而留出足量的比特用於生成高質量的復雜部分。使得有限的比特數能夠在不同的場景間合理分配,這類似於VBR。
同時ABR分配碼率,使得在一定時間內,平均碼率趨近於目標碼率,這樣可以控制輸出文件大小,這點類似於CBR。
因此可以認為ABR是CBR和VBR的一種折中優化方案。
分析視頻編碼碼率控制可以通過三個因素:
1. 視覺質量穩定性,利於視覺主觀質量;
2. 即時輸出碼率,相當於每幀編碼輸出比特數;
3. 輸出視頻文件大小可控,利於傳輸,存儲。
比較這三種碼率控制方式如下:
# 視覺質量穩定性 即時輸出碼率 輸出文件大小
CBR 不穩定 恆定 可控
VBR 穩定 變化 不可控
ABR 基本穩定 變化 可控 (即時碼率變化,但一段時期內平均碼率趨近目標碼率)
5. 在當前X264版本中(version 142),選用ABR需要注意兩個設置,1.fps;2.輸出幀pts計算。
1. fps。ABR會根據幀率來估算每幀的平均數據量,bitrate/fps為平均一幀數據量。
當輸入視頻源為YUV數據,需要顯式的指定正確的幀率--fps,否則X264會用缺省的25fps來計算,有可能控制不到設定的目標碼率。
2. pts計算。ABR算法中用到不同幀的pts作為幀間距離,如果沒有設置輸出幀的pts值,X264會報“non-strictly-monotonic PTS”警告。
編碼出來的視頻文件碼率很小,根本達不到bitrate的設置,同時視頻質量很差,幾乎都為馬賽克。兩種方法解決這個問題:
a. 設置param.b_vfr_input = 0,這時根據fps而不是timebase,timestamps來計算幀間距離。
b_vfr_input=1是X264缺省設置,在zerolatency有=0的配置。
b. 在解碼后主動增加 pic_out.i_pts++; 語句。
這兩個方法可以同時使用。ABR 需要設置 bitrate, fps, 以及param.b_vfr_input = 0。