本發(fā)明涉及視頻編碼技術(shù)領(lǐng)域,尤其涉及一種基于HEVC的Two-Pass碼率控制方法。
背景技術(shù):
隨著視頻編碼技術(shù)的不斷進(jìn)步,主流視頻向高清和超高清方向發(fā)展,隨之帶來了視頻數(shù)據(jù)量的激增,為了達(dá)到更高的壓縮性能,JCT-VC聯(lián)合小組推出了H.265/HEVC視頻編碼標(biāo)準(zhǔn),比以往H.264/AVC標(biāo)準(zhǔn)的壓縮性能提升了一倍。在視頻編碼標(biāo)準(zhǔn)的實(shí)際應(yīng)用中,碼率控制,即在既定的目標(biāo)碼率下獲得最優(yōu)的視頻質(zhì)量,是視頻編碼中不可或缺的關(guān)鍵部分,也是視頻編碼領(lǐng)域研究的熱點(diǎn)。
在視頻編解碼的實(shí)際應(yīng)用中,可以利用的帶寬資源往往是有限的。每幀視頻的復(fù)雜度都隨著視頻內(nèi)容在不斷變化,視頻復(fù)雜度越高,輸出的編碼比特?cái)?shù)也會越高,如果不對碼流加以控制,編碼后得到的視頻碼率就會不斷變化,大幅度變化的碼率不能滿足實(shí)際傳輸信道和傳輸帶寬的要求,所以,碼率控制在視頻編碼標(biāo)準(zhǔn)的實(shí)際應(yīng)用中必不可少。
碼率控制是在當(dāng)前帶寬限制下,通過一定的碼率控制方法來匹配目標(biāo)碼率并取得最優(yōu)視頻質(zhì)量的一種技術(shù)手段。率失真優(yōu)化(Rate-Distortion Optimization,RDO)就是在率失真理論的指導(dǎo)下選擇最優(yōu)的編碼參數(shù),以在編碼輸出碼率和壓縮后造成的失真之間取得最佳的平衡,即在保證視頻質(zhì)量的前提下盡可能降低碼率,或者是在相同輸出碼率條件下盡可能提升視頻質(zhì)量。率失真優(yōu)化理論在碼率控制中占據(jù)十分重要的作用。
率失真理論最早在1959年由香農(nóng)發(fā)表的“保真度準(zhǔn)則下的離散信源編碼理論”而逐漸受到學(xué)者的關(guān)注,主要針對在允許一定失真的情況下,信源壓縮的極限是什么這一問題,首次對率失真函數(shù)R(D)作出定義和論述。在之后相關(guān)領(lǐng)域的學(xué)者和專家不斷地研究之后,率失真理論逐漸完善化和系統(tǒng)化。
視頻的質(zhì)量與最終輸出碼流的大小都主要受量化過程的影響,對同一視頻使用不同的量化參數(shù)會得到不同的碼率和視頻質(zhì)量。所以,碼率控制的主要目的是得到一組量化參數(shù)QP,用它們來控制后續(xù)的編碼流程,最終達(dá)到目標(biāo)碼率的要求。其中,重點(diǎn)就是找到碼率和量化參數(shù)之間的映射關(guān)系,并建立模型,從而通過目標(biāo)碼率來獲得所需的量化參數(shù)。
視頻編碼標(biāo)準(zhǔn)中使用的幀內(nèi)預(yù)測和幀間預(yù)測方法,使得編碼塊之間的依賴性很強(qiáng),它們的率失真性能也不能獨(dú)立的分割開來考慮。因此,雖然率失真函數(shù)給出量化參數(shù)集和失真、碼率之間的關(guān)系,但是直接使用率失真函數(shù)來求解量化參數(shù)是非常復(fù)雜的。實(shí)際的編碼標(biāo)準(zhǔn)應(yīng)用中,碼率控制一般分為兩個步驟進(jìn)行,如圖1所示,其中,第一步是比特分配(Bit Allocation),就是把目標(biāo)碼率按一定的規(guī)則分配到圖像組(GOP)、幀(Frame)以及編碼塊(CTU)等圖像單位上;第二步就是建立合適的率失真模型計(jì)算量化參數(shù)(QP),以控制后續(xù)的量化器,使得最終輸出的碼率可以匹配給定的目標(biāo)碼率。
(1)比特分配
最大編碼塊(Largest Coding Unit,LCU)是H.265/HEVC標(biāo)準(zhǔn)中可以獨(dú)立編碼的基本單元,H.264/AVC標(biāo)準(zhǔn)中與此對應(yīng)的是宏塊(Micro Block,MB)。對于HEVC標(biāo)準(zhǔn),碼率控制所能控制的最小單元,即能夠?yàn)槠鋯为?dú)分配量化參數(shù)的最小單元也是LCU。碼率控制的第一步是碼率分配,即比特分配。比特分配是逐步細(xì)分的,一般做法如圖2所示,先將目標(biāo)碼率下的總比特?cái)?shù)按一定規(guī)則先分配至GOP圖像組中,再依次將碼率分配至每一幀圖像,進(jìn)而分配至LCU級。同時(shí),每一級中每編碼完一個圖像單元,就根據(jù)編碼實(shí)際使用的比特?cái)?shù)的情況,對后續(xù)比特分配進(jìn)行調(diào)整和更新,即使用剩余比特?cái)?shù)來更新后續(xù)的比特分配。
(2)量化參數(shù)QP的計(jì)算
碼率控制的第二步是由第一步得到比特分配的結(jié)果去求得一組量化參數(shù)QP,重點(diǎn)就是對碼率和量化參數(shù)QP之間率失真關(guān)系模型的建立。率失真模型的精準(zhǔn)度是決定最終輸出的碼流是否能達(dá)到目標(biāo)碼率要求的關(guān)鍵,對碼率控制模塊的性能具有決定性意義。視頻領(lǐng)域?qū)<液蛯W(xué)者對率失真模型進(jìn)行了廣泛的研究,建立了很多率失真關(guān)系的近似模型,主要由一階線性模型、二次模型、指數(shù)模型、對數(shù)模型、R-λ模型等。
技術(shù)實(shí)現(xiàn)要素:
為了解決現(xiàn)有技術(shù)存在的問題,本發(fā)明提供一種基于Two-Pass的HEVC碼率控制方法。
本發(fā)明的技術(shù)方案是:一種基于HEVC的Two-Pass碼率控制方法,該方法的具體步驟為:
步驟1,快速預(yù)編碼視頻序列,并收集對應(yīng)編碼單元的統(tǒng)計(jì)信息;
步驟2,將根據(jù)前面收集的統(tǒng)計(jì)信息,進(jìn)行比特分配、率失真模型參數(shù)訓(xùn)練擬合以及量化參數(shù)QP的計(jì)算。
一種基于HEVC的Two-Pass碼率控制方法還包括以下步驟:視頻編碼之前通常會先分割成若干個小的GOP圖像組,一個GOP圖像組通常包括至少一幀圖像;每幀圖像通常進(jìn)一步分割為若干碼塊(LCU),從而進(jìn)一步編碼。
所述圖像有三種類別:I幀、P幀和B幀;其中,I幀是幀內(nèi)編碼幀,只能參考本幀圖像內(nèi)的像素進(jìn)行預(yù)測,同時(shí)能夠作為P幀和B幀的參考幀,是預(yù)測編碼中的關(guān)鍵幀,本發(fā)明所提出的碼率控制方法將重點(diǎn)關(guān)注I幀,即幀內(nèi)預(yù)測編碼的碼率控制。
所述步驟1的包括以下步驟:
步驟a:初始化;對于給定視頻序列,在編碼的cfg配置文件中配置固定的量化參數(shù)QP值,同時(shí)將RateControl參數(shù)設(shè)置為0,關(guān)閉碼率控制開關(guān);
步驟b:CU劃分;輸入給定視頻序列,在函數(shù)TEncCu::xCompressCU()中對當(dāng)前視頻序列的每一個LCU進(jìn)行遞歸地劃分;
步驟c:判斷是否劃分到16×16;利用劃分深度uiDepth變量是否小于3的條件,判斷當(dāng)前劃分是否到了16×16層級,如小于3,則繼續(xù)劃分;否則,則證明當(dāng)前LCU已劃分到16×16層級,能夠進(jìn)行下一步操作;
步驟d:判斷是否為圖像邊界;利用邊界判斷條件,判斷是否為圖像邊界,若是邊界,有可能存在邊界LCU不能被16整除的情況,則繼續(xù)向下劃分到8×8塊,然后進(jìn)行后續(xù)的預(yù)測、變換編碼過程;
步驟e:收集編碼產(chǎn)生的視頻序列的統(tǒng)計(jì)信息;重點(diǎn)是對每個LCU塊所占的比特?cái)?shù)、整個幀的比特?cái)?shù)、視頻輸出碼率、視頻失真信息的收集;其中,LCU的比特?cái)?shù)和整幀的比特?cái)?shù)信息,可以作為復(fù)雜度,在后續(xù)比特分配時(shí)使用;碼率、失真信息則可以組成(R,D)樣本點(diǎn),供后續(xù)參數(shù)的擬合使用;
步驟f:改變QP值,重復(fù)步驟a到步驟e的編碼過程,直到遍歷22、27、32、37四種QP值。
所述步驟2包括比特分配、率失真模型建立和量化參數(shù)QP計(jì)算三個主要部分,具體步驟為:
步驟?。簬壉忍胤峙洌辉赥EncRCSeq::create()函數(shù)中,根據(jù)目標(biāo)碼率和當(dāng)前序列的幀率,計(jì)算目標(biāo)比特?cái)?shù),并將目標(biāo)比特?cái)?shù)平均分配給每一幀;
步驟ⅱ:修改TEncCu::updateLCUDataISlice()函數(shù),將LCU的復(fù)雜度衡量基準(zhǔn)由原來的64個8×8的SATD和,修改為固定QP為22時(shí)步驟中收集的LCU比特?cái)?shù),即定義文件指針變量以從文件中讀入LCU的比特?cái)?shù)信息,將函數(shù)返回值依次賦值給按光柵掃描順序排列的LCU的復(fù)雜度變量m_costIntra;
步驟ⅲ:遍歷當(dāng)前幀中的每一個LCU,將所有LCU的復(fù)雜度變量m_costIntra的累加和賦值給m_totalCostIntra變量,該變量表示當(dāng)前幀的總復(fù)雜度;
步驟ⅳ:在函數(shù)TEncRCPic::getLCUInitTargetBits()中,為每一個LCU分配比特,算式如下:
TCurrLCU=(TCurrPic-BitHeader-BitCoded)×CCurrLCU
其中,CCurrLCU為當(dāng)前LCU的復(fù)雜度,B1stCurrLCU為First-Pass中收集到的當(dāng)前LCU的比特?cái)?shù),BNotCodedLCUs為步驟1中收集到的當(dāng)前幀中未編碼LCU的比特?cái)?shù);
步驟ⅴ:使用步驟1中收集的視頻碼率、失真信息,以雙曲線R-D模型為基準(zhǔn),擬合當(dāng)前視頻序列的模型參數(shù)C、K;
步驟ⅵ:按照R-D模型和R-λ模型的對應(yīng)關(guān)系,計(jì)算R-λ模型的模型參數(shù)α、β;
步驟ⅶ:根據(jù)在線訓(xùn)練模型參數(shù)的R-λ模型,利用步驟ⅳ中為當(dāng)前LCU分配的比特?cái)?shù),計(jì)算用于當(dāng)前LCU的λ值,并檢驗(yàn)是否符合約束;
步驟ⅷ:根據(jù)步驟ⅶ中獲得的λ值以及算式QP=4.2005lnλ+13.7122中描述的λ與QP之間的關(guān)系,計(jì)算用于當(dāng)前LCU量化過程的QP值,并檢驗(yàn)是否符合約束;
步驟ⅸ:應(yīng)用步驟ⅷ中得到的QP值集,進(jìn)行完整的編碼過程。
與現(xiàn)有技術(shù)相比,本發(fā)明有益效果是:
1)在高低不同的目標(biāo)碼率下,相比于HM16.0中的標(biāo)準(zhǔn)碼率控制方法,本發(fā)明專利提出的Two-Pass快速方法平均峰值信噪比PSNR對于復(fù)雜度、分辨率各不相同的視頻序列均有提升,平均提升了0.42dB,對于高目標(biāo)碼率下視頻序列的PSNR提升最為明顯,最高可達(dá)3.14dB;
2)在碼率控制精度方面,本發(fā)明專利碼率控制方法的碼率誤差對于不同視頻序列均有降低,平均降低了4.81%,同樣,對于高目標(biāo)碼率下的碼率控制誤差降低最為顯著,最高可降低24.6%的碼率誤差。
附圖說明
圖1碼率控制基本流程;
圖2比特分配基本流程;
圖3不同類型圖像編碼輸出比特?cái)?shù)比較;
圖4 First-Pass算法流程;
圖5 LCU統(tǒng)計(jì)信息存儲順序;
圖6 Second-Pass算法流程;
圖7支持在線訓(xùn)練的Two-Pass快速算法流程。
具體實(shí)施方式
本發(fā)明提出一種基于Two-Pass的HEVC碼率控制方法,其具體方法如下:
視頻編碼之前通常會先分割成若干個小的GOP圖像組,一個GOP圖像組通常包括若干幀圖像,這些圖像有三種類別:I幀(Intra Frame)、P幀(Predictive Frame)和B幀(Bi-directional Interpolate Prediction Frame)。其中,P幀是前向預(yù)測編碼幀,可以參考前面已編碼幀進(jìn)行幀間預(yù)測,消除連續(xù)幀之間的時(shí)間冗余;B幀是雙向預(yù)測內(nèi)插值編碼幀,既可以參考前面已編碼幀的像素,也可以參考后面的幀進(jìn)行編碼;I幀是幀內(nèi)編碼幀,只能參考本幀圖像內(nèi)的像素進(jìn)行預(yù)測,同時(shí)可以作為P幀和B幀的參考幀,是預(yù)測編碼中的關(guān)鍵幀,在預(yù)測編碼中占有十分重要的位置,每個GOP圖像組通常都以I幀作為第一幀。I幀包含一幅圖像所有重要的信息,可以獨(dú)立進(jìn)行解碼,而P幀和B幀的解碼都要依賴于前面的I幀才能完成。同時(shí),在整個視頻壓縮碼流中,I幀會占用較多的比特,甚至可能數(shù)倍于P幀和B幀。如附圖3所示為“RaceHorses”序列(IBBBPBBB結(jié)構(gòu))在固定量化參數(shù)下,不同圖像類型編碼輸出比特?cái)?shù)的比較。I幀編碼輸出的比特?cái)?shù)最多,約為P幀的2倍、B幀的10倍。綜合以上可以看出,I幀在整個視頻編碼序列中占據(jù)十分重要的地位,對I幀進(jìn)行碼率控制,會對整個視頻序列的壓縮效率有至關(guān)重要的影響。因此,本發(fā)明所提出的碼率控制方法將重點(diǎn)關(guān)注I幀,即幀內(nèi)預(yù)測編碼的碼率控制。
本發(fā)明主要分為兩個步驟:在步驟1(First-Pass)中快速預(yù)編碼視頻序列,并收集對應(yīng)編碼單元的復(fù)雜度等統(tǒng)計(jì)信息;在步驟2(Second-Pass)中,將根據(jù)前面收集的統(tǒng)計(jì)信息,進(jìn)行比特分配、率失真模型參數(shù)訓(xùn)練擬合以及量化參數(shù)QP的計(jì)算。
1.步驟1(First-Pass)
步驟1(First-Pass)編碼是本發(fā)明提出的Two-Pass碼率控制方法的第一步,主要用于收集視頻序列重要的統(tǒng)計(jì)信息。為了在線訓(xùn)練模型參數(shù),在本發(fā)明所提的改進(jìn)型Two-Pass碼率控制方法中,需要進(jìn)行多次預(yù)編碼,以得到當(dāng)前視頻序列的多組真實(shí)的碼率和失真的對應(yīng)關(guān)系,進(jìn)而擬合適應(yīng)當(dāng)前視頻序列的模型參數(shù)。多次預(yù)編碼將導(dǎo)致First-Pass的整體編碼時(shí)間成倍增加,大大拖慢了編碼速度。因此,本發(fā)明提出一種快速預(yù)編碼的方法,在步驟1(First-Pass)中將每幀圖像全部劃分成16×16像素塊,即僅對劃分深度為3的CU塊進(jìn)行預(yù)編碼,收集統(tǒng)計(jì)信息,其中實(shí)現(xiàn)過程中重點(diǎn)對邊界情況進(jìn)行了考慮。本發(fā)明使用HM標(biāo)準(zhǔn)軟件模型推薦的最能反映不同量化精細(xì)程度下視頻的壓縮效果的四種固定的QP值(22、27、32、37)進(jìn)行編碼,即進(jìn)行四遍快速預(yù)編碼,得到當(dāng)前序列每一幀的4對(R,D)樣本點(diǎn),用于后續(xù)的模型參數(shù)的擬合;同時(shí),在量化參數(shù)QP值取22下進(jìn)行編碼,將每個LCU中的16×16像素塊統(tǒng)計(jì)到的比特信息相加,作為該LCU塊的復(fù)雜度信息,以便進(jìn)行后續(xù)的Second-Pass編碼。采用快速預(yù)編碼的步驟1(First-Pass)流程如附圖4所示。
改進(jìn)的Two-Pass快速方法中,F(xiàn)irst-Pass編碼的實(shí)現(xiàn)主要有以下幾個步驟:
步驟a:初始化。對于給定視頻序列,在編碼的cfg配置文件中配置固定的量化參數(shù)QP值,同時(shí)將RateControl參數(shù)設(shè)置為0,關(guān)閉碼率控制開關(guān);
步驟b:CU劃分。輸入給定視頻序列,在函數(shù)TEncCu::xCompressCU()中對當(dāng)前視頻序列的每一個LCU進(jìn)行遞歸地劃分;
步驟c:判斷是否劃分到16×16。利用劃分深度uiDepth變量是否小于3的條件,判斷當(dāng)前劃分是否到了16×16層級,如小于3,則繼續(xù)劃分;如不小于3,則證明當(dāng)前LCU已劃分到16×16層級,可以進(jìn)行下一步操作;
步驟d:判斷是否為圖像邊界。利用邊界判斷條件,判斷是否為圖像邊界,若是邊界,有可能存在邊界LCU不能被16整除的情況,則繼續(xù)向下劃分到8×8塊,然后進(jìn)行后續(xù)的預(yù)測、變換等編碼過程;
步驟e:收集編碼產(chǎn)生的視頻序列的統(tǒng)計(jì)信息。重點(diǎn)是對每個LCU塊所占的比特?cái)?shù)、整個幀的比特?cái)?shù)、視頻輸出碼率、視頻失真信息的收集。其中,LCU的比特?cái)?shù)和整幀的比特?cái)?shù)信息,可以作為復(fù)雜度,在后續(xù)比特分配時(shí)使用;碼率、失真信息則可以組成(R,D)樣本點(diǎn),供后續(xù)參數(shù)的擬合使用。
步驟f:改變QP值,重復(fù)步驟a到步驟e的編碼過程,直到遍歷22、27、32、37四種QP值。
其中,每個LCU的統(tǒng)計(jì)信息在輸出文件中的存儲順序按照附圖5所示的光柵掃描順序,從左到右、從上到下依次存儲。同時(shí),F(xiàn)irst-Pass中收集的LCU比特?cái)?shù)占整幀比特?cái)?shù)的比率,將作為本發(fā)明專利采用的精細(xì)復(fù)雜度衡量基準(zhǔn),以供后續(xù)Second-Pass編碼中比特分配時(shí)使用。
此外,視頻的失真信息使用MSE表示,MSE是重建視頻數(shù)據(jù)與原始視頻序列數(shù)據(jù)之間的均方差,其計(jì)算公式如式(1)所示。其中,表示像素的原始值,表示像素的重建值,n表示像素總個數(shù)。
視頻的碼率信息使用bpp表示,即平均每個像素所占的比特?cái)?shù),其計(jì)算公式如式(2)所示。其中,bit表示當(dāng)前幀的總比特?cái)?shù),Ptotal表示當(dāng)前幀的總像素?cái)?shù),w表示當(dāng)前幀的圖像寬度,h表示當(dāng)前幀的圖像高度。
Ptotal=w×h (2)
2.步驟2(Second-Pass)
步驟2(Second-Pass)編碼是本發(fā)明專利提出的Two-Pass碼率控制方法的第二步,是Two-Pass方法的關(guān)鍵步驟。步驟2(Second-Pass)編碼主要有比特分配、率失真模型建立和量化參數(shù)QP計(jì)算三個主要部分,下面將對每一個部分的具體方法和實(shí)現(xiàn)方式進(jìn)行詳細(xì)介紹:
(1)比特分配
對于幀內(nèi)預(yù)測編碼來說,全I(xiàn)幀的參數(shù)設(shè)置相當(dāng)于每個GOP大小為1,其中只包含一幀圖像,也就是1個I幀。所以,對于幀內(nèi)碼率控制來說,按照分層比特分配的策略,GOP級比特分配就相當(dāng)于是幀級比特分配,即將除去頭信息外的目標(biāo)碼率下的比特?cái)?shù)平均分配到每一個I幀圖像。
I幀圖像只能參考本幀已編碼CU塊的像素進(jìn)行預(yù)測編碼,因此,幀內(nèi)碼率控制中比特分配步驟的重點(diǎn)就是LCU級的比特分配方法。在此,本發(fā)明專利使用精細(xì)復(fù)雜度衡量基準(zhǔn)作為權(quán)重,為每個LCU分配比特。即使用First-Pass中收集的每個LCU比特?cái)?shù)占對應(yīng)幀總比特?cái)?shù)的比值作為該LCU的復(fù)雜度,為其在當(dāng)前目標(biāo)碼率下分配比特。假設(shè)當(dāng)前幀的總目標(biāo)比特?cái)?shù)為,頭信息所占比特?cái)?shù)為,已編碼像素塊實(shí)際所用總比特?cái)?shù)為,則當(dāng)前LCU能分得的比特?cái)?shù)可以用公式(3)表示:
TCurrLCU=(TCurrPic-BitHeader-BitCoded)×CCurrLCU
其中,CCurrLCU為當(dāng)前LCU的復(fù)雜度,B1stCurrLCU為First-Pass中收集到的當(dāng)前LCU的比特?cái)?shù),BNotCodedLCUs為First-Pass中收集到的當(dāng)前幀中未編碼LCU的比特?cái)?shù)。
(2)率失真建模
視頻編碼標(biāo)準(zhǔn)的目標(biāo)始終是,使用更少的比特?cái)?shù)達(dá)到更高的清晰度,這一目標(biāo)可以表示成有約束問題。解決該有約束的率失真優(yōu)化問題的一個有效的方法是,采用拉格朗日乘子優(yōu)化法(Lagrange Operator Algorithm),將有約束優(yōu)化問題轉(zhuǎn)換成無約束優(yōu)化問題。引入拉格朗日乘子后,有約束問題可以轉(zhuǎn)化為式(4)的形式。
即:
如果將視頻編碼中的率失真優(yōu)化問題看作是在碼率和失真之間取得最佳的平衡,那么,拉格朗日乘子λ就是調(diào)節(jié)碼率和失真之間平衡的關(guān)鍵。從物理意義上說,拉格朗日乘子λ就是率失真曲線的斜率。
H.265/HEVC標(biāo)準(zhǔn)經(jīng)典碼率控制提案K0103中通過雙曲線形式的R-D模型,如式(6)所述,推導(dǎo)出了碼率R和拉格朗日乘子λ之間的關(guān)系,最終建立即率失真模型,如式(7)所述,其中,α和β為統(tǒng)一的模型參數(shù),分別取經(jīng)驗(yàn)值3.2003和-1.367。本發(fā)明實(shí)現(xiàn)的Two-Pass碼率控制方法中采用該R-λ模型作為本發(fā)明率失真模型。但不再使用統(tǒng)一的模型參數(shù),而是利用步驟1(First-Pass)中經(jīng)過多次快速預(yù)編碼收集的視頻序列的碼率、失真等統(tǒng)計(jì)信息,針對每一個視頻序列,在線訓(xùn)練適應(yīng)各視頻序列的模型參數(shù)。
D(R)=C·RK (6)
在本發(fā)明的步驟2(Second-Pass)編碼階段,利用步驟1(First-Pass)中收集的碼率R和失真D的統(tǒng)計(jì)信息,對每個視頻序列都可以得到對應(yīng)的4組(R,D)樣點(diǎn),以式(6)為模型,對每個序列的樣點(diǎn)組進(jìn)行參數(shù)擬合,可以得到每個視頻序列的模型參數(shù)C和K的經(jīng)驗(yàn)值。再根據(jù)R-D模型和R-λ模型的關(guān)系,如式(7)所述,可以推導(dǎo)出參數(shù)C、K與參數(shù)α、β之間的關(guān)系,如式(8)和式(9)所述。
α=-C·K (8)
β=K-1 (9)
然后,根據(jù)式(8)和式(9)可以計(jì)算出適應(yīng)于當(dāng)前視頻序列R-λ模型的模型參數(shù)α和β,代入式(7),既可作為當(dāng)前視頻序列的在線訓(xùn)練R-λ模型。
(3)計(jì)算量化參數(shù)QP
經(jīng)過上述在線訓(xùn)練過程,利用得到的R-λ模型,根據(jù)第(1)部分分配到當(dāng)前編碼單元的碼率,計(jì)算出對應(yīng)的λ值,再根據(jù)λ和量化參數(shù)QP之間的對應(yīng)關(guān)系,如式(10)所述,計(jì)算求得QP值,并用于后續(xù)編碼過程。
QP=4.2005lnλ+13.7122 (10)
同時(shí),為了減小相鄰編碼單元圖像質(zhì)量的波動,將相鄰LCU的量化參數(shù)QP差控制在1以內(nèi),當(dāng)前LCU與其圖像級QP差控制在2以內(nèi)。
綜合以上介紹和分析,可以將步驟2(Second-Pass)的方法具體實(shí)現(xiàn)步驟總結(jié)為以下幾步:
步驟?。簬壉忍胤峙?。在TEncRCSeq::create()函數(shù)中,根據(jù)目標(biāo)碼率和當(dāng)前序列的幀率,計(jì)算目標(biāo)比特?cái)?shù),并將目標(biāo)比特?cái)?shù)平均分配給每一幀;
步驟ⅱ:修改TEncCu::updateLCUDataISlice()函數(shù),將LCU的復(fù)雜度衡量基準(zhǔn)由原來的64個8×8的SATD和修改為First-Pass中收集的LCU比特?cái)?shù),即定義文件指針變量以從文件中讀入LCU的比特?cái)?shù)信息,將函數(shù)返回值依次賦值給按光柵掃描順序排列的LCU的復(fù)雜度變量m_costIntra;
步驟ⅲ:遍歷當(dāng)前幀中的每一個LCU,將所有LCU的復(fù)雜度變量m_costIntra的累加和賦值給m_totalCostIntra變量,該變量表示當(dāng)前幀的總復(fù)雜度;
步驟ⅳ:在函數(shù)TEncRCPic::getLCUInitTargetBits()中,按照式(3)的方法,為每一個LCU分配比特;
步驟ⅴ:使用步驟1(First-Pass)中收集的視頻碼率、失真等信息,以雙曲線R-D模型為基準(zhǔn),擬合當(dāng)前視頻序列的模型參數(shù)C、K;
步驟ⅵ:按照R-D模型和R-λ模型的對應(yīng)關(guān)系,計(jì)算R-λ模型的模型參數(shù)α和β;
步驟ⅶ:根據(jù)在線訓(xùn)練模型參數(shù)的R-λ模型,利用步驟ⅳ中為當(dāng)前LCU分配的比特?cái)?shù),計(jì)算用于當(dāng)前LCU的λ值,并檢驗(yàn)是否符合約束;
步驟ⅷ:根據(jù)步驟ⅶ中獲得的λ值以及式(10)中描述的λ與QP之間的關(guān)系,計(jì)算用于當(dāng)前LCU量化過程的QP值,并檢驗(yàn)是否符合約束;
步驟ⅸ:應(yīng)用步驟ⅷ中得到的QP值集,進(jìn)行完整的編碼過程。
綜上所述,本發(fā)明提出的Two-Pass快速算法的實(shí)現(xiàn)流程如圖7所示,具體實(shí)現(xiàn)步驟如下:
步驟1(First-Pass階段)
步驟1):輸入視頻序列,對每幀視頻都僅對劃分深度為3,即全部劃分成16×16的碼塊進(jìn)行預(yù)編碼,若當(dāng)前塊為圖像邊界,則繼續(xù)劃分到8×8大小再進(jìn)行編碼,其中,預(yù)編碼過程使用的量化參數(shù)QP值為事先設(shè)定的固定值;
步驟2):將每個LCU中包含的所有16×16塊(包括小于16×16的邊界像素塊)所占比特?cái)?shù)相加,作為當(dāng)前LCU所占的比特?cái)?shù),按Z字型掃描順序,依次輸出到文件中備用;
步驟3):收集視頻序列編碼后的整體碼率、失真等統(tǒng)計(jì)信息作為后續(xù)率失真模型參數(shù)擬合的樣本點(diǎn),并輸出到文件中備用;
步驟4):改變QP值,重復(fù)以上步驟(本發(fā)明取四種不同的QP值:22、27、32、37進(jìn)行實(shí)驗(yàn));
步驟2(Second-Pass階段)
步驟5):將當(dāng)前目標(biāo)碼率配置到“encoder_intra_main.cfg”配置文件中,將目標(biāo)碼率下的比特?cái)?shù)平均分配到每一幀;
步驟6):以當(dāng)前幀除去已編碼LCU所用比特后的剩余總比特?cái)?shù)為基準(zhǔn),按步驟2)中收集的前LCU的復(fù)雜度權(quán)重,本發(fā)明以固定QP為22時(shí)收集的統(tǒng)計(jì)信息為準(zhǔn),為當(dāng)前LCU分配比特;
步驟7):使用步驟3)中收集的視頻碼率、失真等信息,以雙曲線R-D模型為基準(zhǔn),擬合當(dāng)前視頻序列的模型參數(shù)C、K;
步驟8):按照R-D模型和R-λ模型的對應(yīng)關(guān)系,計(jì)算R-λ模型的模型參數(shù)α和β;
步驟9):對當(dāng)前幀應(yīng)用上述在線訓(xùn)練出的R-λ模型,根據(jù)步驟6)中分配的比特情況,計(jì)算出應(yīng)用于當(dāng)前編碼單元的λ值,進(jìn)而計(jì)算出QP值,并對QP值作一定限制,以降低相鄰編碼單元的視頻質(zhì)量波動;
步驟10):使用步驟9)中得到的QP值進(jìn)行整體視頻序列的編碼,輸出比特流。
實(shí)驗(yàn)數(shù)據(jù)顯示,在高低不同的目標(biāo)碼率下,相比于HM16.0中的標(biāo)準(zhǔn)碼率控制算法,本發(fā)明提出的Two-Pass快速算法平均峰值信噪比PSNR對于復(fù)雜度、分辨率各不相同的視頻序列均有提升,平均提升了0.42dB,對于高目標(biāo)碼率下視頻序列的PSNR提升最為明顯,最高可達(dá)3.14dB;在碼率控制精度方面,本發(fā)明碼率控制算法的碼率誤差對于不同視頻序列均有降低,平均降低了4.81%,同樣,對于高目標(biāo)碼率下的碼率控制誤差降低最為顯著,最高可降低24.6%的碼率誤差。
以上所述的僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本領(lǐng)域的技術(shù)人員來說,在不脫離本發(fā)明整體構(gòu)思前提下,還可以作出若干改變和改進(jìn),這些也應(yīng)該視為本發(fā)明的保護(hù)范圍。