H.264的码率控制算法
H.264的碼率控制算法采用了多種技術(shù),其中包括自適應(yīng)基本單元層(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、線性MAD模型、二次率失真模型等。并且采用了分層碼率控制策略,共分為三層:GOP層、幀層和基本單元層。在JVT的提案中,采用的是JVT-G012碼率控制算法,該算法提出了基本單元的概念,將一幀劃分為若干個基本單元,基本單元可能是一宏塊、一行宏塊、一場或一幀。幀層碼率控制根據(jù)網(wǎng)絡(luò)帶寬、緩存占用量、緩存大小及剩余比特來分配每一幀的目標(biāo)比特;在基本單元層碼率控制中,目標(biāo)比特由該幀的剩余目標(biāo)比特平均得到。這些技術(shù)的采用成功地解決了傳統(tǒng)碼率控制算法與H.264的率失真優(yōu)化技術(shù)之間存在的因果矛盾,能較準(zhǔn)確地控制輸出碼率,輸出視頻質(zhì)量較好。
H.264中的JVT.G012算法采用的二次R—Q模型如下:
??????? 這一模型用于基本單元的量化參數(shù)計算,其中R代表編碼量化系數(shù)所需的碼字位數(shù),Q指基本單元的量化步長,MAD通過以下線性預(yù)測模型進(jìn)行預(yù)測:
??????? 其中MADcb和MADpb代表當(dāng)前基本單元和前一幀相應(yīng)位置處的MAD,a1,a2是模型系數(shù),在每一個基本單元的最后一個宏塊處理中通過線性回歸的方法進(jìn)行更新。
??????? JVT的碼率控制比以往的標(biāo)準(zhǔn)更加困難。因為量化參數(shù)不僅在碼率控制算法中使用而且在率失真優(yōu)化中應(yīng)用,從而導(dǎo)致一種稱為“雞與蛋"的悖論(Chicken and Egg Dilemma):為了在當(dāng)前幀的宏塊中應(yīng)用率失真優(yōu)化,首先要有一個量化參數(shù),這個量化參數(shù)通過計算當(dāng)前幀的MAD(Mean Absolute Difference)得到。然而,只有在率失真優(yōu)化以后才能得到當(dāng)前幀的MAD。并且編碼處理所使用的信道帶寬可能是恒定的,也可能是可變的。必須同時考慮恒定比特率(Constant Bit Rate,CBR)和可變比特率(Variable Bit Rate,VBR)兩種情況。目前的碼率控制機制大多針對恒定碼率的情況.
??????? 率失真理論是視頻編碼的一個基本部分。率失真優(yōu)化(RDO)在給定的碼率限制下最小化解碼失真,Lagrangian方法可以在碼率和失真之間有效地進(jìn)行折中。在H.264標(biāo)準(zhǔn)中,Lagrangian方法用于運動補償?shù)哪J竭x擇和幀內(nèi)預(yù)測。換言之,它可以在給定的碼率限制下,最小化失真,尋找到塊的最佳運動向量和編碼模式。然而,Lagrangian方法的應(yīng)用使碼率控制變得更困難,因為QP涉及到碼率控制和失真計算。換言之,碼率控制方案在調(diào)整QP后將影響塊的運動和模式選擇。在MPEG.4碼率控制中,可以在估計QP前通過執(zhí)行二次R—D模型來獲得X1,X2、MAD和目標(biāo)比特數(shù)。但在H.264標(biāo)準(zhǔn)中,QP在碼率控制和RDO中都指定了,因此在執(zhí)行RC時就存在一個問題:對MB執(zhí)行RDO,要先通過MB的MAD決定MB的QP,然而MB的MAD只有在RDO運行后才能獲得。這就是一個蛋雞悖論。
如上所述,在H.264標(biāo)準(zhǔn)的碼率控制中存在兩個問題:
1.在執(zhí)行RDO之前,MAD是未知的。
2.雖然在運動補償后可以獲得每個編碼模式的MAD,但最佳編碼模式仍然未知,所以不能決定哪個MAD可以用于估計QP。
Ma等人提出了一個新的H.264碼率控制方案,該方案沒有考慮QP與MAD之間的相關(guān)性,但它不是single—pass碼率控制算法。雖然該算法可以實現(xiàn)目標(biāo)比特數(shù)且沒有明顯的比特變動,但執(zhí)行RDO要花費2倍的時間,對宏塊而言這樣的時I司復(fù)雜度是不可接受的。
??????? H.264中的碼率控制方法是以提案JVT—G012為藍(lán)本的。JVT.G012提案通過引入基本單元和線形模型的概念,提出一種自適應(yīng)基本單元層碼率控制方案。基本單元可能是一幀、片或宏塊。并提出了一種線性模型,通過前一幀相應(yīng)位置的基本單元預(yù)測當(dāng)前基本單元MAD。為闡述G012提案,本文首先對其中的關(guān)鍵技術(shù)進(jìn)行分析。
1。基本單元的定義
?????? 假設(shè)某一幀由Nmbpic個宏塊組成,那么定義基本單元為一個由Nmbpic個宏塊中連續(xù)的Nmbunit個宏塊所組成的組。那么在該幀中的總的基本單元的個數(shù)為:
Nunit=Nmbpic/Nmbunit
??????? 需要注意的是,如果采用了比較大的基本單元,那么PSNR可以達(dá)到一個較高的值,同時比特的波動也會增大。另一方面,如果采用了比較小的基本單元,比特的波動會比較的小,但是相應(yīng)的會帶來PSNR的損失。
2.流量往返模型(Fluid Tramc Model)
3.MAD的線性預(yù)測模型
?????? 這里,該算法一個線性模型來預(yù)測當(dāng)前幀中的基本單元的MAD值,它的參
?
?
?
預(yù)測模型參數(shù)a1和a2更新方法分為三步,如下所述:
????? 第一步一數(shù)據(jù)點選擇:數(shù)據(jù)點是用于更新模型參數(shù),數(shù)據(jù)點的數(shù)量以及質(zhì)量對于模型的準(zhǔn)確性有著重要的影響。通常而言,數(shù)據(jù)點越多,模型越準(zhǔn)確。在JM86模型中,采用滑動窗口機制進(jìn)行數(shù)據(jù)點的選擇,窗口大小通常為20。
??????第二步一計算模型參數(shù):根據(jù)選中的數(shù)據(jù)點,算法收集預(yù)測的MAD和實際MAD的值,采用線性回歸的方法,計算得到a1和a2。
????? 第三步一去除壞的數(shù)據(jù)點:在得到al和a2之后,根據(jù)滑動窗口中數(shù)據(jù)點的參考值,用a1和a2形成的預(yù)測模型計算數(shù)據(jù)點的預(yù)測值,然后將得到的值與數(shù)據(jù)點的原始預(yù)測值比較,計算誤差,如果誤差大于一定的值(JM中取誤差的均值),則將該數(shù)據(jù)點去除,用更新后的數(shù)據(jù)點重新計算模型參數(shù)al和a2。
總結(jié)
以上是生活随笔為你收集整理的H.264的码率控制算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I帧、B帧和P帧的特点和编码的基本流程
- 下一篇: 看穿面试这件事儿……