X264碼率控制總結2——x264碼率控制方法概述

X264碼率控制方法概述
x264/doc/ratecontrol.txt
A qualitative overview of x264's ratecontrol methods
By Loren Merritt

歷史筆記:
本文件是過時的,但相當一部分敘述仍然是準確的,以下是一些重要的碼率控制算法更新:
1. 默認情況下,MB-tree代替了qcomp用以計算各幀的複雜度,MB-tree是qcomp在宏塊級的有效推廣。MB-tree還替代了B幀QP固定偏移。
2. 現在自適應量化(Adaptive quantization)被用來在各幀之間分配質量(distribute quality);即使關閉MB-tree,幀內各MB也不再是恆定QP。
3. 爲了提高碼率控制精度,VBV(Video Buffer Verifier)運行在每行而不是每幀。


x264的碼率控制算法主要是基於libavcodec中的經驗算法。但仍基於以下一些理論點:
1.我們常常希望能夠獲得恆定質量(constant quality)的視頻序列,但是恆定質量並不意味着恆定的PSNR或者恆定的QP。對於人眼不敏感的高細節複雜度或者高運動場景,可以增加QP而不會損失太多的視覺質量;
2.另一方面,將稍多一些的比特分配給影響運動補償效果的場景更能提升視頻序列質量;(MBtree就是基於這一條來做的)
3. 上面兩點都與給定QP時編碼一幀圖像使用的比特數相關。
4. 根據一個QP值編碼一幀的輸出比特,可以預測其他QP值編碼相同幀的輸出比特,當然QP值相差越大,預測的越不準確。
5. 幀的重要性取決於參考這幀的其他幀的數目,由於I幀是其後P/B幀的參考基礎,它需要更低的QP值,以保證它的質量。I幀>P幀>做參考B幀>非參考B幀。


x264碼率控制的框架主要是三步,不同的碼率控制方法,這三步的內容不同,但步驟一樣:
1、根據複雜度在可控的範圍內分配qp:二次編碼是在第一遍編碼的結果上在全局分配,ABR是基於mbtree分配
2、根據模式特性縮放qp:考慮輸出碼率,VBV等因素,
3、碼率溢出控制

碼率控制方法:
    二次編碼:
基於第一次編碼得到的各幀數據,我們可以在保證文件總字節數的情況下,選擇QP來儘可能的提升視覺質量,這可分爲3步:
(1)在開始第二次編碼前,選擇幀間比特分配相關數。缺省的公式是“複雜性^0.6”,其中的複雜性是指在一個恆定QP下幀編碼輸出比特數(基於第一次的編碼結果預測而來)。
(2)在視頻序列全局縮放步驟(1)中的結果,以滿足總的編碼輸出文件大小要求。
(3)開始編碼。編碼一幀後,更新QP與幀輸出比特數的預測誤差。如果第二次編碼輸出比特數總是偏離第一次的預測(通常是因爲第二次使用了較慢,但性能較好的編碼設置),在其後所有幀的qscales上都乘以這個誤差的倒數,用來糾正這種偏離。
此外還有一個短時補償算法去防止視頻開始階段(此時沒有多少數據做全局補償)和結尾階段(此時沒有足夠的幀數做反應)的結果偏離初始設置太遠。


    一次編碼,ABR:
一次編碼的和二次編碼的區別在於一次編碼在編碼當前幀的時候沒有任何有關當前幀的可借鑑信息,只有前面已編碼幀的信息。因此一次編碼的複雜度是前向預測得到的。
(1)和二次編碼類似,選擇幀間比特分配相關數。但由於沒有第一遍編碼的結果做預測,x264運行一個1/2分辨率(lowres)的快速運算估計算法,使用SATD的結果來預測輸出比特數。同時,I幀的相關數繼承前面已編碼I幀的結果。
(2)由於不知道將來幀的複雜度,所以只能根據前向幀做縮放。縮放因子(Scaling factor)的選擇標準是,如果使用此因子到後續所有幀,總的輸出比特數滿足預先要求。
(3)溢出補償和2次編碼相同。通過調節補償力度,可以滿足合理的文件大小,但質量會低於二次編碼。


    一次編碼,CBR(VBV兼容):
(1)同ABR。
(2)縮放因子是基於局部平均(依賴VBV緩衝區大小)而不是所有前向幀。
(3)嚴格的溢出補償,並在VBV快要滿的時候有強制條件限制QP。注意:a.CBR的輸出可能比所要求的比特數少一點;b.即使一幀違反了VBV的約束,它也不會被重新編碼。


    一次編碼, CRF:
(1) 同ABR.
(2) 縮放因子是一個常量,--crf。
(3) 無溢出補償.

    CQP:
每幀QP只是簡單的基於幀類型改變。
發佈了40 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章