1. 碼率控制的選擇策略:?率失真優(yōu)化模型
RDO: rate-distortion optimization率失真優(yōu)化
限定碼率值Rc,選擇合適的編碼模式簿盅,使得失真D最小。
編碼模式包括量化步長、宏塊模式選擇箩溃、幀內/幀間預測模式選擇等怠噪。
碼率控制的RDO模型的目標是確定每幀或每個宏塊合適的量化步長恐似。
1.1 Lagrangian RDO
H.264標準使用了一種基于Lagrangian優(yōu)化算法的RDO模型實現(xiàn)碼率控制,數(shù)學原理很完美傍念,但實際效果不是很好矫夷,所以實用中很少使用。
在數(shù)學最優(yōu)化問題中憋槐,拉格朗日乘數(shù)法是一種尋找變量受一個或多個條件所限制的多元函數(shù)的極值的方法双藕。這種方法將一個有n?個變量與k?個約束條件的最優(yōu)化問題轉換為一個有n?+?k個變量的方程組的無條件極值問題,進而采用偏微分或全微分法就能很容易求出其極值阳仔。
1.2 X264碼率控制算法
而X264編碼器的碼率控制算法與H.264標準的有很大差別忧陪,主要是根據(jù)經(jīng)驗總結出來的算法。
2. X264的碼率控制的幾個基本原則
(1) 我們希望獲得恒定視覺質量的編碼碼流近范,但是恒定視覺質量并不意味著恒定的PSNR或QP嘶摊。對高復雜度、高運動感的圖像评矩,人眼并不會注意到細節(jié)叶堆,因而可以在某種程度上增大QP而達到相同的視覺質量。
(2) 根據(jù)圖像的重要性來確定不同的QP稚照。由于B幀不用于預測任一其他幀蹂空,故其重要性相對于I、P幀要低果录,因而B幀的量化步長可以較大上枕。
3. X264的RDO模型
X264采用一種半精度幀的SATD(sum of absolute transformed difference)作為模式選擇的依據(jù)。SATD是將殘差做hadamard變換再取絕對值的總和弱恒,它作為一種簡單的時頻變換辨萍,能在一定程度上衡量生成碼流的大小。下圖是一個簡單的2x2的Hadamard變換矩陣:
4. 碼率控制的三種思路-CBR,VBR,ABR
CBR: constants bit rate, 固定碼率編碼器的輸出碼率是一個固定值。
在一個帶寬受限的信道中進行多媒體通訊的時候CBR是非常有用的锈玉,但是CBR不適合進行存儲爪飘,因為CBR會導致沒有足夠的碼率對復雜的內容進行編碼,使復雜內容的質量下降拉背,同時對簡單的內容會浪費一些碼率师崎,這時VBR是較好的選擇。
VBR: Variable Bit Rate椅棺,可變比特率
其原理就是將圖像中的復雜部分用高比特率編碼犁罩,簡單部分用低比特率編碼,通過這種動態(tài)調整編碼速率的方式两疚,進一步得到視頻質量和比特率之間的平衡床估。它的主要優(yōu)點是可以讓每一幀都能大致達到相同的視覺質量,缺點是編碼時無法估計壓縮出來的文件大小诱渤。
ABR: Average Bit Rate丐巫,平均比特率
可以做為VBR和CBR的一種折衷選擇
5. X264中所用的ABR算法
第一,對當前圖像做抽樣濾波勺美,得到分辨率是原來一半的小圖递胧,在小圖上做半像素精度預測,與原圖相減得到殘差Xd赡茸,再對Xd做hadamond變換并求絕對和得到SATD谓着,當前圖像的復雜度就是由當前幀SATD與之前幀SATD值的加權平均構成。
如:設第一幀SATD1=100262坛掠,第二幀SATD2=12812赊锚,第三幀SATD3=12022,則當前幀的復雜度為:
接著由速率控制公式計算相應的qpscale:
其中qcomp為線性量化控制參數(shù)屉栓,0為固定碼率舷蒲,1為固定QP,默認值是0.6友多。
第二牲平,再由之前圖像的編碼信息確定比例因子rate_factor調整qpscale的值,使得編碼速率盡可能接近所要求的平均比特率域滥。若之前已編碼幀的實際比特數(shù)越是大于目標比特數(shù)纵柿,rate_factor越小,縮放后的qpscale就越大启绰,量化步長也越大昂儒,生成的比特流越小,從而達到調整比特率的目的委可。
rate_factor的確定
編碼前會初始化一個長期復雜度累積因子:
complex_sum = 0.01 * 700000f_qcompress * sqrt(mb_count)
當前幀編碼完會使用下述公式累積長期復雜度累積因子:
complex_sum += bits * (0.85 * 2(qp-12)/6) / qp
? 由上式可以看出長期復雜度因子與已編碼的比特數(shù)正相關渊跋。
然后計算截止到當前幀的目標比特數(shù):
wanted_bits_window += bitrate/fps
而rate_factor就是wanted_bits_window與complex_sum的比值:
rate_factor = wanted_bits_window / complex_sum
第三,對qpscale做溢出補償處理,通過補償能夠合理控制文件的大小拾酝,但在一定程度上會降低質量:
? ? ? ? ? ? qpscale = qpscale x overflow
? ? ? ? ? ? overflow? = 1.0 +(total_bits – wanted_bits_window)/abr_buffer
如果實際編碼比特數(shù)total_bits大于目標比特數(shù)燕少,overflow大于1,qpscale被放大蒿囤,從而生成更少的碼流客们;相反如果實際比特數(shù)小于目標比特數(shù),overflow小于1材诽,qpscale被縮小镶摘,量化步長變小,從而生成更多的碼流岳守,調整了比特率。? ?
第四碌冶,由qpscale得到當前幀的量化步長qp:
6. X264中所用的CBR算法
第一步與ABR算法一樣湿痢,算出當前幀的復雜度之后,使用qcomp=0來計算當前幀的qpscale:
在第二步中CBR所用的rate_factor不是由前面幀確定的扑庞,而是由當前vbv_buffer的大小決定的譬重。
Video Buffering Verifier,視頻緩存檢驗器
VBV buffer 的作用是處理各幀編碼后大小不一和輸出CBR 的矛盾罐氨。
CBR規(guī)定encoder的輸出碼率為恒定臀规,但是各幀編碼后的大小不是固定的(I,B,P幀的存在),因此需要在encoder后面加入VBV buffer栅隐。?可以將VBV buffer想象成為一個水池塔嬉,水池的入口連接著encoder的輸出,水池的出口為恒定的碼率輸出租悄。?為了使得輸出恒定谨究,encoder必須保證水池既不上溢也不下溢。下溢會導致無數(shù)據(jù)輸出泣棋,上溢會導致數(shù)據(jù)丟失胶哲。?所以encoder在編碼一幀時會參考當前vbv buffer的充盈情況,推算出一個rate_factor潭辈,用來調整當前幀的量化步長鸯屿,進而確定當前幀應當編碼多少比特才能保證vbv_buffer既不上溢也不下溢。
第三把敢,CBR的溢出補償更加嚴格寄摆,而且在VBV接近0時將會強制限制QP。但在VBV沒用完時并不會強制限制QP修赞,所以CBR的結果多少會比目標碼率低一點冰肴。還要注意的是,如果在所有機制過后,一個幀還是超出了VBV的限制熙尉,那它是不會被重新編碼的联逻。
7. X264中所用的CRF算法
恒定碼率因子碼率控制算法
第一步同ABR算法。
第二步rate_factor恒定為參數(shù)-crf所指定的值检痰。
第三步?jīng)]有溢出補償包归。
8. X264所用的CQP算法
恒定量化參數(shù)碼率控制法
QP只是簡單的和幀類型相關
比如I幀使用QP=26的量化步長,P幀使用QP=28铅歼,B幀使用QP=30公壤。
9. X264所用的自適應量化模型
自適應量化模式Adaptive Quantization Mode。
AQ可以更好把碼率分配到各個宏塊中椎椰。
它的基本原理也是根據(jù)當前宏塊的復雜度SADT厦幅,并與當前幀的平均復雜度做對比,若高于平均慨飘,則分配更多的碼率确憨,即用小于當前幀QP值的量化步長;低于平均值則分配更少的碼率瓤的,即用大于當前幀的QP值的量化步長休弃。
具體到每一個mb,x264又使用了一種復雜的mb-tree的宏塊級的碼率分配算法圈膏。
10.?動態(tài)碼率分配
針對丟包率相對固定的環(huán)境塔猾,動態(tài)碼率分配(DBA)功能可以在視頻通話過程中自動且動態(tài)地調整視頻碼率,以消除或避免丟包稽坤。例如丈甸,在一個384?kbps的視頻通話中(320?kbps用于視頻,64kbps用于音頻)檢測到一個穩(wěn)定在10%的丟包率尿褪,DBA就會降低約10%視頻碼率老虫,由320kbps降到288kbps左右。然后重新采樣信號茫多,觀察是否還存在丟包現(xiàn)象祈匙。如果有必要,DBA可以進一步降低視頻碼率天揖,直到在數(shù)秒內不再出現(xiàn)丟包為止夺欲。???
在降低碼率后,如果DBA測定丟包只是暫時的(持續(xù)時間不到幾秒鐘)今膊,DBA將逐步增加視頻碼率些阅。然而,如果DBA持續(xù)檢測到丟包現(xiàn)象斑唬,它就不再調整視頻碼率市埋,并將通話繼續(xù)進行下去黎泣。這一方法,使得DBA非常適合于由網(wǎng)絡過度使用或因吞吐量問題引起的丟包現(xiàn)象缤谎。
11. 在不同碼控下的測試結果