1. X264顯式支持的一趟碼率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。這三種方式的優先級是ABR > CQP > CRF.
[cpp] view plaincopy算法
bitrate和QP都沒有缺省值,一旦設置他們就表示要按照相應的碼率控制方法進行編碼,CRF有缺省值23,沒有任何關於編碼控制的設置時就按照CRF缺省值23來編碼。 通常的使用建議: CQP – 通常不推薦使用,在一些算法驗證工做中會使用這種模式 CRF – 適合在關注一遍編碼質量而輸出文件大小或碼率不是太緊要的場景下使用,通常網絡壓片使用CRF。 1 pass ABR – 適用於流媒體或者目標碼率受限的實時應用場景。 2 pass VBR – 適用於有目標碼率限制而又有時間能夠進行二次編碼的非實時應用。網絡
2. CQP,恆定QP. 完好省值 最簡單的碼率控制方式,每幀圖像都按照一個特定的QP來編碼,每幀編碼後的數據量有多大是未知的。
參數qp_constant設置的是P幀的QP。I,B幀的QP根據f_ip_factor, f_pb_factor,計算獲得。
[cpp] view plaincopyapp
連續多個B幀時,QP會漸增。 x264 YUV420格式 8比特採樣的QP範圍是[0, 51]。QP值越小,編碼視覺質量越好。QP=0爲無失真編碼。less
在研究編碼算法的時候,通常會選用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 second). --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的缺點在於輸出碼流大小不可控。同時對於複雜度恆定的內容(例如新聞播音)沒什麼優點。ui
ABR編碼爲簡單場景分配較少的比特,從而留出足量的比特用於生成高質量的複雜部分。使得有限的比特數可以在不一樣的場景間合理分配,這相似於VBR。 同時ABR分配碼率,使得在必定時間內,平均碼率趨近於目標碼率,這樣能夠控制輸出文件大小,這點相似於CBR。 所以能夠認爲ABR是CBR和VBR的一種折中優化方案。編碼
分析視頻編碼碼率控制能夠經過三個因素: 1. 視覺質量穩定性,利於視覺主觀質量; 2. 即時輸出碼率,至關於每幀編碼輸出比特數; 3. 輸出視頻文件大小可控,利於傳輸,存儲。 比較這三種碼率控制方式以下: # 視覺質量穩定性 即時輸出碼率 輸出文件大小 CBR 不穩定 恆定 可控 VBR 穩定 變化 不可控 ABR 基本穩定 變化 可控 (即時碼率變化,但一段時期內平均碼率趨近目標碼率)
在當前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. 在解碼後主動更新pts, pic_out.i_pts++; 這兩種方式均可以免ABR碼率控制失效的問題。