王喜民,楊鼎才,閆俊海
(河北省燕山大學(xué)信息科學(xué)與工程學(xué)院,秦皇島066004)
H.264中碼率控制原理如圖1所示,碼率控制的任務(wù)就是在保證緩沖器不產(chǎn)生上溢和下溢的前提下,通過調(diào)整一些編碼參數(shù)(如量化參數(shù))來使編碼比特率達(dá)到期望值。以便編碼器輸出碼率能夠在比特率恒定的通信信道和網(wǎng)絡(luò)中傳輸,這種利用信道緩沖器對(duì)編碼產(chǎn)生的比特?cái)?shù)加以控制的技術(shù)就是碼率控制。
圖1 碼率控制原理圖
在視頻編碼過程中,編碼器和傳輸信道間的緩沖器起了重要的作用。編碼器使緩沖器的占用量保持在50%左右。如果緩沖器發(fā)生上溢,則會(huì)損失一些數(shù)據(jù),相反,如果緩沖器的占用量過低就會(huì)浪費(fèi)帶寬。緩沖器的輸入端是編碼器產(chǎn)生可變的比特流,輸出端以恒定的比特率把數(shù)據(jù)傳輸?shù)叫诺郎稀]斎刖彌_器和輸出緩沖器的數(shù)據(jù)差值將保存在緩沖器中,為了防止緩沖器上溢,當(dāng)緩沖器的占用量達(dá)到某一個(gè)限值時(shí),就跳過下一幀,即該時(shí)刻緩沖器沒有輸入只有輸出,從而減小緩沖器的占用量,因此,通過對(duì)碼率控制中跳幀的適當(dāng)控制可以較好地緩解由于場(chǎng)景和物體劇烈運(yùn)動(dòng)所帶來的緩存上溢現(xiàn)象,達(dá)到優(yōu)化圖像質(zhì)量的目的。
這種避免緩存區(qū)的溢位,在碼率控制策略中,選擇跳過一幀或幾幀圖像不對(duì)其編碼,就是碼率控制中的跳幀技術(shù)。
以往的跳幀控制算法中,一般都只是將緩沖器的上限定為80%,并將80%作為跳幀的依據(jù),當(dāng)緩存容量超過80%,將此幀定為跳幀,相反,當(dāng)緩存容量低于25%的時(shí)候,也將此幀定為跳幀。但是這樣處理有其弊端性.事實(shí)上,當(dāng)要編碼的圖像發(fā)生場(chǎng)景變換或者圖像物體運(yùn)動(dòng)劇烈的時(shí)候,由于圖像包含更多的信息,必然會(huì)造成編碼后的比特?cái)?shù)上漲,往往會(huì)超過緩沖器上閾值的限制,如果就這樣簡(jiǎn)單的將其判為跳幀,會(huì)導(dǎo)致運(yùn)動(dòng)劇烈的圖像丟失,遺漏掉圖像中的重要細(xì)節(jié),從而使圖像質(zhì)量下降。
跳幀算法中,假定編碼的目標(biāo)比特率為Bit_Rate,視頻流的幀率為F,緩存區(qū)大小由Buffer_Size表示,緩存區(qū)充盈度用緩存中的比特?cái)?shù)Buffer_Fullness表示,當(dāng)緩存區(qū)充盈度超過一個(gè)閾值Threshold,則跳過當(dāng)前幀不對(duì)其編碼,直到當(dāng)前緩存區(qū)充盈度低于門限值之后,再對(duì)此時(shí)的圖像進(jìn)行編碼,通過跳幀的方法可以防止緩存區(qū)溢位。在編碼第一個(gè)I幀之前,將Buffer_Fullness初始化為0。設(shè)B為剛剛編碼完的第i幀對(duì)應(yīng)的比特?cái)?shù),則跳幀算法為:
Buffer_Size=Bit_Rate*TimeDelay;
FrameSkipped=0;
Buffer_Fullness=Buffer_Fullness+B-Bit_Rate/F;
while(Buffer_Fullness>=Threshold)
{
Buffer_Fullness=Buffer_Fullness-Bit_Rate/F;
FrameSkipped++;
}
其中,F(xiàn)rameSkipped為跳幀數(shù),緊接著上一次編碼的第i幀之后將被編碼的是第(i+1+FrameSkipped)幀。采用跳幀的目的是通過犧牲圖像連續(xù)性來換取圖像質(zhì)量的穩(wěn)定性。根據(jù)人眼的視覺特性,偶爾少量的圖像跳幀,對(duì)視頻質(zhì)量的影響并不大。但是如果發(fā)生頻繁的連續(xù)跳幀,則會(huì)引起圖像的停滯、跳躍,嚴(yán)重影響視頻通信質(zhì)量。這在碼率控制策略中,是要堅(jiān)決避免的。在常規(guī)的碼率控制策略中,通常為了避免溢出,當(dāng)緩存區(qū)內(nèi)比特?cái)?shù)超過緩存區(qū)空間Bs的80%時(shí),跳過當(dāng)前幀而不對(duì)其作編碼,直到其低于臨界值后再進(jìn)行編碼。如下式所示:
以往改進(jìn)算法中大部分采用 MADratio,而MADratio也能夠準(zhǔn)確的反映出圖像的復(fù)雜度,但是它卻不能預(yù)測(cè)場(chǎng)景切換幀。因?yàn)镸ADratio算法如下:
對(duì)于存在場(chǎng)景切換的視頻序列,由于場(chǎng)景切換幀與之前幀的幀間相關(guān)性小,場(chǎng)景切換的MADP預(yù)測(cè)不準(zhǔn)確,進(jìn)而造成 MADratio計(jì)算不準(zhǔn)確。因此MADratio不能預(yù)測(cè)場(chǎng)景切換。應(yīng)該采用的是文獻(xiàn)[3]中提到的PSNRdropratio來預(yù)測(cè)場(chǎng)景切換,并作相關(guān)處理。PSNRdropratio的計(jì)算在編碼器計(jì)算完每幀的PSNR值之后進(jìn)行,其計(jì)算步驟如下:
假設(shè)當(dāng)前編碼幀j幀被跳過,利用離j幀最近的j-1幀作為j幀的重構(gòu)幀,計(jì)算出 j幀的PSNR,這里記為 PSNRskip,j,然后利用下式可以計(jì)算 PSNRdrop,j
PSNRdrop,j=PSNRj-1- PSNRskip,j
其中 PSNRj-1為j-1幀的實(shí)際 PSNR
當(dāng)前編碼 j幀的 PSNRdropratio,j,則由下式得到
主動(dòng)跳幀策略,即在緩存區(qū)并未達(dá)到空間上限的80%時(shí),為了保留一些信息量較高,相對(duì)重要的圖像,而主動(dòng)跳過一些跟上一幀圖像相關(guān)度較高,相對(duì)來說并不十分重要的圖像。通過主動(dòng)跳幀,可以有效的降低緩存區(qū)充盈度,從而有效的抑制由于緩存區(qū)長(zhǎng)期處于高充盈度狀態(tài)。而引發(fā)的圖像連續(xù)跳幀。預(yù)先的主動(dòng)跳幀,降低了緩存區(qū)充盈度,可以有效的防止緩存區(qū)達(dá)到極度充盈狀態(tài):即使跳過1幀或2幀圖像仍然不能有效的釋放緩存區(qū)空間,而需要連續(xù)跳過數(shù)幀圖像。通過實(shí)驗(yàn)仿真發(fā)現(xiàn),該主動(dòng)跳幀策略,可以防止緩存區(qū)長(zhǎng)期處于臨界飽和狀態(tài),并且有效的抑制大量圖像的連續(xù)跳幀。
如果當(dāng)前編碼的P幀圖像同時(shí)滿足以下三個(gè)條件,則采用主動(dòng)跳幀策略,不對(duì)該幀編碼,而直接編碼下一幀圖像:
(1)當(dāng)前GOP的跳幀標(biāo)志位Skip_Flag為1。在開始一個(gè)GOP的編碼時(shí),將跳幀標(biāo)志位置0,一旦在當(dāng)前GOP中有跳幀發(fā)生時(shí),則將Skip_Flag置為1。表示在當(dāng)前GOP中,通過使用基于預(yù)測(cè)的拉格朗日最優(yōu)化方法選擇的I幀量化參數(shù)進(jìn)行編碼時(shí),仍然不能完全抑止跳幀的發(fā)生。在當(dāng)前GOP的編碼中,仍然存在繼續(xù)跳幀的可能性,因此有必要做好主動(dòng)跳幀的準(zhǔn)備。
(2)當(dāng)前緩存區(qū)充盈度超過緩存區(qū)空間的60%。即當(dāng)前緩存區(qū)維持在一個(gè)較高的充盈度狀態(tài)。即使緩存區(qū)空間沒有達(dá)到上限的80%,但是根據(jù)上一條件,可以認(rèn)為當(dāng)前GOP存在跳幀的可能性。為了避免當(dāng)緩存區(qū)充盈度繼續(xù)增加之后,而發(fā)生對(duì)跳幀圖像不具選擇能力的被動(dòng)跳幀,因此在緩存區(qū)充盈度為60%的時(shí)候設(shè)置一個(gè)判決閾。當(dāng)這個(gè)閾值選擇較大,接近80%的時(shí)候,則不能有效的通過預(yù)判來避免被動(dòng)跳幀的發(fā)生。而當(dāng)閾值選擇較小時(shí),則可能造成過多的圖像滿足主動(dòng)跳幀的條件,被主動(dòng)跳過而不進(jìn)行編碼,但是從實(shí)際的編碼結(jié)果來分析,并不需要有這么多的圖像發(fā)生主動(dòng)跳幀,而為后續(xù)的相對(duì)重要的圖像留出緩存區(qū)空間。因此這個(gè)閾值的選擇顯得非常重要,如果選擇不當(dāng),反而會(huì)導(dǎo)致使用了主動(dòng)跳幀策略之后比原來的被動(dòng)跳幀控制有更多的圖像跳幀,對(duì)視頻序列的連續(xù)性造成負(fù)面的影響。通過對(duì)大量序列的仿真發(fā)現(xiàn),將閾值設(shè)置在緩存區(qū)空間的60%,能夠有效起到提前釋放緩存區(qū)空間的作用,為此后一些信息量較高、相對(duì)重要的圖像留出編碼空間,使其可以被保留而不被跳幀,同時(shí)也有效避免了后續(xù)圖像發(fā)生大量連續(xù)的跳幀。
(3)計(jì)算當(dāng)前幀的,通過仿真實(shí)驗(yàn),認(rèn)為當(dāng)前幀相對(duì)其他的圖像來說,復(fù)雜度較低,不存在明顯的場(chǎng)景切換和快速的局部運(yùn)動(dòng)。跳過這一幀圖像對(duì)此后圖像編碼質(zhì)量影響不大,仍然可以根據(jù)前一幀圖像作為參考幀來進(jìn)行幀間編碼。保證主動(dòng)跳幀之后,對(duì)整個(gè)視頻序列的主觀質(zhì)量不造成明顯的影響。其算法的流程如圖2所示。該策略可以通過跳過一些復(fù)雜度較低,對(duì)于整個(gè)序列而言并不重要的圖像,來為后面復(fù)雜度較高,不能丟失的圖像留出緩存區(qū)空間。通過主動(dòng)跳幀,降低了緩存區(qū)充盈度,可以有效的防止緩存區(qū)達(dá)到極度充盈狀態(tài):即使跳過1幀或2幀圖像仍然不能有效的釋放緩存區(qū)空間,而需要連續(xù)跳過數(shù)幀圖像。
為了分析提出的主動(dòng)跳幀策略在防止圖像連續(xù)跳幀中的作用,在下表中給出了JVT-H017碼率控制策略跟采用和未采用主動(dòng)跳幀策略的低延遲碼率控制算法對(duì)比實(shí)驗(yàn)的結(jié)果分析。選用Stefan標(biāo)準(zhǔn)QCIF測(cè)試序列。將每一個(gè)GOP的長(zhǎng)度定為30幀,其結(jié)構(gòu)為 IPPP,不采用 B幀;在編碼時(shí),將 Basic Unit的大小定為99個(gè)宏塊,即一個(gè)Basic Unit的大小為一幀圖像的大小,相當(dāng)于是將碼率控制算法分為GOP層和幀層;每一個(gè)序列各編碼150幀圖像,編碼的幀率為30fps,目標(biāo)比特為120kbps,緩存區(qū)大小為24kbits,相當(dāng)于允許延時(shí)200ms。
圖2 主動(dòng)跳幀策略流程圖
表1 三種方法的跳幀結(jié)果比較
從表1中可以發(fā)現(xiàn),不論是否采用主動(dòng)跳幀,該方法在低延遲下都能更好的控制跳幀,這在上文已有詳細(xì)的對(duì)比分析。在此重點(diǎn)針對(duì)采用和未采用主動(dòng)跳幀策略的實(shí)驗(yàn)結(jié)果,來分析主動(dòng)跳幀策略的作用。在H017方法中,不但跳幀數(shù)目最多,共53幀,而且出現(xiàn)了大量的連續(xù)跳幀,其中在第32幀處出現(xiàn)6幀跳幀,然后僅編碼完第38幀,在第39時(shí)又出現(xiàn)6幀的跳幀,然后編碼完第45幀,又立即在第46幀處出現(xiàn)連續(xù)的4幀跳幀。這樣連續(xù)的跳幀嚴(yán)重影響了視頻的主觀視覺質(zhì)量,在視頻通信中需要極力避免。在未采用主動(dòng)跳幀時(shí),共跳幀15幀,其中有1次連續(xù)跳了4幀圖像,1次連續(xù)跳了3幀圖像。其中在第38幀處,連續(xù)跳完2幀之后,僅編碼了第42和43幀后又連續(xù)出現(xiàn)了3幀跳幀。在采用了主動(dòng)跳幀后,雖然總體的跳幀數(shù)量也為15幀,但是最大的連續(xù)圖像跳幀為3幀,且僅出現(xiàn)一次。原來在第38幀處連續(xù)出現(xiàn)的2幀和3幀連續(xù)跳幀,由于在第36幀的主動(dòng)跳幀,在第38幀時(shí)沒有圖像跳幀,僅在第42幀處連續(xù)跳過了3幀圖像。有效的抑制了圖像的連續(xù)跳幀。當(dāng)然從表1中發(fā)現(xiàn),主動(dòng)跳幀策略通過分散的預(yù)先跳幀來避免連續(xù)跳幀的發(fā)生。從對(duì)比實(shí)驗(yàn)結(jié)果可以發(fā)現(xiàn),雖然在第76幀發(fā)生了主動(dòng)跳幀,但是其實(shí)即使這里沒有主動(dòng)跳幀,其后續(xù)的P幀都不會(huì)發(fā)生跳幀,如果僅在當(dāng)前的GOP分析,反而增加了圖像的跳幀。但是從整體來分析,主動(dòng)跳幀緩解了緩存區(qū)的充盈度,雖然在當(dāng)前沒有明顯的體現(xiàn)出減少跳幀的作用,卻為下一個(gè)GOP留出了更多的緩存區(qū)空間,減少其跳幀的可能性,并能提高其編碼質(zhì)量。通過引入主動(dòng)跳幀之后,該算法在有效維持圖像質(zhì)量的同時(shí),仍可以有效的抑制圖像的連續(xù)跳幀。
針對(duì)傳統(tǒng)的跳幀技術(shù),提出了新的主動(dòng)跳幀策略。該策略在緩存區(qū)尚未達(dá)到跳幀閾值時(shí),主動(dòng)跳過一些跟上一幀圖像相關(guān)度較高,相對(duì)來說并不十分重要圖像,來降低緩存區(qū)的充盈度。通過主動(dòng)跳幀不但可以為視頻中相對(duì)重要的圖像留出編碼空間防止其被跳過,并且能夠有效的抑制圖像的連續(xù)跳幀,提高圖像的質(zhì)量。
[1]S W WU.Improved Rate Control for Low-Delay Communications in H.264/AVC Video Coding Standard[R].National Yet- sen University,July,2004.
[2]Minqiangjiang,Xiaoquanyi,Nan Ling.On Enhancing H264 Rate Control by PSN Based Frame Complexity Estimation[J].IEEE Transactions Consumer Electronics,2003(1):281-286.
[3]劉文堯,龔聲蓉.基于H.264的碼率控制算法的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2007(5):28-39.
[4]周駿華,石繼剛.一種基于運(yùn)動(dòng)復(fù)雜度的H.264碼率控制跳幀算法[J].浙江工業(yè)大學(xué)學(xué)報(bào),2006(4):13-15.
[5]畢厚杰.新一代視頻壓縮編碼標(biāo)準(zhǔn) -H.264/AVC[M].北京:人民郵電出版社,2005.