X264位元速率控制總結1 ABR,CQP,CRF

2021-06-28 19:51:08 字數 4096 閱讀 9357

1.x264顯式支援的一趟位元速率控制方法有:abr, cqp, crf. 預設方法是crf。這三種方式的優先順序是abr > cqp > crf.

[cpp]view plain

copy

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,計算得到。

[cpp]view plain

copy

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可以依次增大。
當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的缺點在於複雜場景位元速率不夠用,簡單場景位元速率浪費,因此編碼內容的視覺質量不穩定。通常在較低位元率下,這種質量的變化會更加明顯。

vbr編碼為簡單場景分配較大的qp,為複雜的場景分配較小的qp,得到基本穩定的輸出視覺質量。

vbr的缺點在於輸出碼流大小不可控。同時對於複雜度恆定的內容(例如新聞播音)沒什麼優勢。

abr編碼為簡單場景分配較少的位元,從而留出足量的位元用於生成高質量的複雜部分。使得有限的位元數能夠在不同的場景間合理分配,這類似於vbr。

同時abr分配位元速率,使得在一定時間內,平均位元速率趨近於目標位元速率,這樣可以控制輸出檔案大小,這點類似於cbr。

因此可以認為abr是cbr和vbr的一種折中優化方案。

1. 視覺質量穩定性,利於視覺主觀質量;

2. 即時輸出位元速率,相當於每幀編碼輸出位元數;

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

#        視覺質量穩定性         即時輸出位元速率        輸出檔案大小

cbr          不穩定               恆定               可控

vbr           穩定                變化              不可控

abr         基本穩定               變化               可控 (即時位元速率變化,但一段時期內平均位元速率趨近目標位元速率)

在當前x264版本中(version 142),選用abr需要注意兩個設定,1.fps;2.輸出幀pts計算。
1. fps。abr會根據幀率來估算每幀的平均資料量,bitrate/fps為平均一幀資料量。
2. pts計算。abr演算法中用到不同幀的pts作為幀間距離,如果沒有設定輸出幀的pts值,x264會報「non-strictly-monotonic pts」警告。

a. 設定param.b_vfr_input = 0,這時用fps而不是timebase,timestamps來計算幀間距離

b. 在解碼後主動更新pts, pic_out.i_pts++;

這兩種方式都可以避免abr位元速率控制失效的問題。

X264位元速率控制總結1 ABR,CQP,CRF

1.x264顯式支援的一趟位元速率控制方法有 abr,cqp,crf.預設方法是crf。這三種方式的優先順序是abr cqp crf.cpp view plain copy if bitrate rc method abr else if qp qp constant rc method cqp e...

h 264位元速率控制

h.264的碼流傳輸是基於目前有限的網路頻寬來進行的,以目前的壓縮效率來說,運動不算劇烈 細節不多的影像,在720p的情況下,1000kbps壓縮損耗較少 psnr較大 能達到比較好的觀賞效果,1080p則需要2000kbps。當然,隨著影象運動劇烈程度加大,細節增多的情況,則需要更大的bps來保證...

h 264位元速率控制

h.264的碼流傳輸是基於目前有限的網路頻寬來進行的,以目前的壓縮效率來說,運動不算劇烈 細節不多的影像,在720p的情況下,1000kbps壓縮損耗較少 psnr較大 能達到比較好的觀賞效果,1080p則需要2000kbps。當然,隨著影象運動劇烈程度加大,細節增多的情況,則需要更大的bps來保證...