X264碼率控制總結1——ABR,CQP,CRF

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 – 一般不推薦使用,在一些算法驗證工作中會使用這種模式    
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,計算得到。
        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 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的缺點在於輸出碼流大小不可控。同時對於複雜度恆定的內容(例如新聞播音)沒什麼優勢。

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碼率控制失效的問題。
       
發佈了40 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章