x264學習(1)——簡述x264幾種碼率控制方式的實現

原文地址:http://blog.sina.com.cn/s/blog_784448d60101017t.html

x264的碼率控制是基於libavcodec和經驗的。這篇文章將嘗試說明覆雜的碼率控制算法背後的理論基礎。


幾點理論


1、固定質量並不等價於PSNR或QP完全恆定。複雜場景或者高速場景中難以辨別的細節會被選擇性省略,以節省空間;
2、如果運動預測生效,將獲得更好的質量:低速場景中,1個錯誤可能停留好幾秒鐘。此時如果運動預測啓用,只需要更改一個幀,就能增進整個場景的質量;
3、如果有一個幀的一個QP的編碼結果,就可以預測這個幀其它QP編碼將消耗的空間。QP差距越大,預測越不準確;

4、幀的重要性取決於參照它的幀的數量。因此I幀將根據最近的可被參考幀的複雜程度來調正自己的QP。用作參考幀的B幀(自由B幀)的QP高於P幀,參考的B幀的QP則介於P幀和用作參考幀的B幀之間。


幾種碼率控制模式


2pass


指定目標碼率,2趟編碼

在第1趟編碼(比如下面提到的ABR)時爲每一幀生成一些統計信息,以助在第2趟編碼中時爲每一幀找到最好的量化參數。第2趟編碼包含以下三部分:
1、第2趟編碼開始之前,拿出一些空間用於在幀間靈活分配。空間大小的計算與目標碼率無關,只是一個使用恆定QP編碼的碼率的比值,一般是0.6;
2、用(1)得出來的值和目標碼率計算每一幀要使用的QP。使用VBV是方法之一,VBV是一個迭代的過程,因爲使用VBV和QP會互相影響;

3、現在開始編碼。每編完一幀,按照還剩下的空間重新計算後面將要使用的QP,如果編碼過程中第2趟編碼的實際碼率偏離了目標碼率(因爲第二趟編碼用了更慢的參數)(譯者按:也就是使用了快速第一趟編碼,所以通常是低於目標碼率),會在隨後的幀裏做出變化(譯者按:通常是增大碼率)以糾正錯誤趨勢。另外,還會有個小處理,會保證我們不在視頻的開始或結束的階段遠遠偏離目標碼率。


ABR


1趟編碼,平均碼率

目標是達到和2趟編碼同樣的效果,但沒有第1趟編碼的幫助,所以只能一邊編碼一邊控制碼率:
1、和2趟編碼的(1)過程一樣,但因爲沒有第1趟編碼的幀信息,所以把幀縮小爲一半分辨率後用一個快速預測算法和SATD(譯者按:sum of absolute transform differences絕對變換差值和)(此計算也用於P幀B幀決策)做一個預測來代替。而且也不知道後面的GOP(譯者按:圖像組)的大小和複雜度,所以I幀的決策基於之前的幀;
2、因爲不知道後面幀的複雜度,所以只根據前面的幀來測算QP。測算的因數將定爲如果應用於目前所有幀則可以滿足目標比特率的數;

3、和2趟編碼一樣有溢出補償,調節補償力度可以得到很接近2趟編碼的質量(但大小將在接近正負10%的範圍內浮動),通過這種方式可以在一定程度上控制住文件大小而又不太犧牲視頻質量。


CBR


1趟編碼,恆定碼率(用VBV限制)

1、同ABR;
2、測算因子基於一個範圍內(由VBV buffer大小決定)的均值,而不是之前所有幀;

3、溢出補償更加嚴格,而且在VBV接近0時將會強制限制QP。但在VBV沒用完時並不會強制限制QP,所以CBR的結果多少會比目標碼率低一點。還要注意的是,如果在所有機制過後,一個幀還是超出了VBV的限制,那它是不會被重新編碼的。


CRF


1趟編碼,恆定碼率因子(譯者注:就是crf參數,crf = constant rate factor)

1、同ABR;
2、換算因子恆定爲 –crf參數的值;

3、沒有溢出補償。


CQP


恆定量化參數,QP只簡單地和幀類型相關。

 

以上所有類型:
H.264規範允許每個宏塊使用不同的QP。x264目前沒有實現這一特性,碼率控制算法只會爲每一幀生成一個QP。
翻譯自:http://git.videolan.org/?p=x264.git;a=blob_plain;f=doc/ratecontrol.txt;hb=HEAD
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章