關(guān)鍵詞: AVC , 編碼 , 視頻
2001年12月,ITU-T和ISO/IEC成立了JVT(JointVideoTeam,視頻聯(lián)合工作組),以H.26L作為平臺,致力于制定下一代視頻編碼標(biāo)準(zhǔn)。2003年5月,正式推出H.264/AVC新標(biāo)準(zhǔn),該標(biāo)準(zhǔn)的正式名稱為H.264/MPEG-4part10AVC。H.264/AVC標(biāo)準(zhǔn)的主要目標(biāo)是力求設(shè)計(jì)簡單有效的編碼技術(shù),并具有高效的壓縮性能和易于網(wǎng)絡(luò)傳輸?shù)哪芰Γ詽M足日益增長的“對話型”(移動(dòng)視頻電話、會(huì)議)、“非對話型”(視頻存儲、廣播以及流媒體等)以及數(shù)碼影院、視頻監(jiān)控等視頻應(yīng)用的場合。
1 H.264/AVC的基本編碼結(jié)構(gòu)
與早期的視頻編碼標(biāo)準(zhǔn)相同,H.264/AVC標(biāo)準(zhǔn)沒有明確定義一對完整的編解碼器,而是定義了編碼碼流的語法和對碼流進(jìn)行解碼的方法。H.264/AVC采用了與以往標(biāo)準(zhǔn)類似的運(yùn)動(dòng)估計(jì)/補(bǔ)償+分塊DCT變換的混合編碼框架。
H.264/AVC采用“返回基本”的思想去開發(fā)高性能的視頻編碼標(biāo)準(zhǔn),即采用現(xiàn)有的基本算法和結(jié)構(gòu),通過精心優(yōu)化計(jì)算流程和方法來取得更好的視頻編碼性能。與現(xiàn)有的H.261,H.263標(biāo)準(zhǔn)相比,H.264保持了編碼器的系統(tǒng)結(jié)構(gòu)不變,主要包括四個(gè)步驟:
(1)把一幀圖像劃分為小塊(Macro.Block及Block),每個(gè)小塊包含很多像素點(diǎn),把對整幅圖像的編碼分成對許多小塊的處理。
(2)通過對圖像塊的變換、量化和熵編碼(或變長編碼),消除圖像中的空間冗余。
(3)由于相鄰的各幀圖像存在很大的相似性(即時(shí)間冗余),所以只需要將相鄰幀圖像間的變化進(jìn)行編碼傳送即可,這是通過運(yùn)動(dòng)搜索和運(yùn)動(dòng)補(bǔ)償實(shí)現(xiàn)的。對每一個(gè)編碼塊,通過搜索上一編碼幀(或之前的幾幀)的相應(yīng)位置來找到一個(gè)運(yùn)動(dòng)向量,這一向量將和幀間差值一起傳送,用于這一圖像塊的編解碼。
(4)殘余編碼:對于原始塊和相應(yīng)的預(yù)測塊之間的差值進(jìn)行變換、量化和熵編碼,以去除當(dāng)前幀剩下的空間冗余。
但是與以前的編碼算法H.263相比,H.264加入了一些新的特性,以提高編碼效率。這些特征如下:
(1)對于進(jìn)行幀內(nèi)編碼的圖像,不是直接對原始圖像進(jìn)行變換、量化和編碼,而是首先采用多種不同的預(yù)測方法對圖像進(jìn)行預(yù)測,然后對差值進(jìn)行上述處理,以取得更佳的編碼效率。
(2)在運(yùn)動(dòng)搜索和運(yùn)動(dòng)補(bǔ)償方面,H.264采用了從4x4到16×16共13種搜索塊進(jìn)行運(yùn)動(dòng)搜索,以提高匹配程度,采用1/4像素精度進(jìn)行搜索,以提高搜索精度。另外,根據(jù)對編碼延時(shí)的不同要求,H.264還可以對以前多個(gè)已編碼幀進(jìn)行運(yùn)動(dòng)搜索,以達(dá)到最佳效果。
(3)在變換編碼方面,H.264采用了4×4的整數(shù)變換(ICT)代替DCT變換,整數(shù)變換的效果接近DCT,但運(yùn)算量要少,而且在反變換過程中不會(huì)因計(jì)算精度的問題而引入誤差。
(4)在熵編碼過程中,H.264使用單一的變長編碼(UVLC)和基于內(nèi)容的上下文變長編碼(CAVLC)進(jìn)行編碼。
2 編碼結(jié)構(gòu)的分層處理
H.264的編碼結(jié)構(gòu)在概念上分為兩層。視頻編碼層(VideoCodingLayer,VCL)負(fù)責(zé)高效率的視頻壓縮能力;網(wǎng)絡(luò)適配層(NetworkAdaptionLayer,NAL)負(fù)責(zé)網(wǎng)絡(luò)的適配,即對不同網(wǎng)絡(luò)要有不同的適應(yīng)能力,例如以恰當(dāng)方式對數(shù)據(jù)進(jìn)行打包和傳送。H.264編碼器分層結(jié)構(gòu)如圖1所示。在VCL和NAL之間定義了一個(gè)基于分組方式的接口,打包和相應(yīng)的信令屬于NAL的一部分。這樣,高效率編碼和網(wǎng)絡(luò)適應(yīng)性的任務(wù)則分別由VCL,和NAL來完成。
VCL包括基于塊的運(yùn)動(dòng)補(bǔ)償混合編碼和一些新特性。NAL負(fù)責(zé)針對下層網(wǎng)絡(luò)的特性對數(shù)據(jù)進(jìn)行封裝,包括成幀,發(fā)信號給邏輯信道,利用同步信息等。NAL從VCL獲得數(shù)據(jù),包括頭信息、段結(jié)構(gòu)信息和實(shí)際凈荷信息(如果采用數(shù)據(jù)分割技術(shù),凈荷數(shù)據(jù)可能由幾部分組成)。NAL的任務(wù)就是要正確地將它們映射到傳輸協(xié)議上。NAL下面是各種具體的協(xié)議,如H.323,H.324等。NAL層的引入大大提高了H.264適應(yīng)復(fù)雜信道的能力。
JVT標(biāo)準(zhǔn)中的NAL定義了視頻編解碼器本身和外部的接口。它的基本單元是NALUs(NerworkAb-stractionLayerUnits)。這對實(shí)現(xiàn)許多現(xiàn)行網(wǎng)絡(luò)包的傳輸方式提供了很好的支持。
一個(gè)NALU由一個(gè)一字節(jié)的頭和包含特定類型句法元素的可變長度比特串組成。一個(gè)NALU可以包含slice的編碼信息、隨機(jī)訪問點(diǎn)、參數(shù)集信息或補(bǔ)充增強(qiáng)信息等。NALU頭結(jié)構(gòu)如下:
NALU類型(T)是一個(gè)5比特的子段,指出該NALU單元是32種不同類型中的哪一種。類型1~12已被H.264定義,類型24~31可由H.264以外的其他標(biāo)準(zhǔn)使用。RTP載荷規(guī)范將采用其中的某些值來表示包聚合和包分割。其他值被保留待將來使用。
nal_reference_idc(R)用來標(biāo)記該NALU在重建過程中的重要程度。0表示該NALU不會(huì)被用作參考幀,因此允許解碼器或網(wǎng)關(guān)將之丟棄而不會(huì)引起錯(cuò)誤傳播。該值越高,表示該NALU中數(shù)據(jù)越重要。這就允許網(wǎng)絡(luò)節(jié)點(diǎn)根據(jù)該值有力保護(hù)重要數(shù)據(jù)。
forbidden_zero_bit(F)在編碼過程中置為0,當(dāng)網(wǎng)絡(luò)節(jié)點(diǎn)鑒別出NALU中的比特錯(cuò)誤時(shí),可以將該位置1。由于網(wǎng)絡(luò)環(huán)境不同,解碼器可能對包含比特錯(cuò)誤的NALU采取不同的操作,有的則干脆丟棄。for-biddenzerobit為這種操作提供了便利。
一些使用包傳輸?shù)木W(wǎng)絡(luò)能夠直接使用NALUs,把他們直接作為H.223AL3SDUs或RTP包的載荷即可。然而,在一些面向碼流的系統(tǒng)面前,如ITU-T的視頻會(huì)議建議H.320和數(shù)字電視中的MPEG-2傳輸流等,需要比特或字節(jié)流的格式。因此,JVT標(biāo)準(zhǔn)定義了一種從NALUs到碼流格式的變換,即把NALUs用起始碼字封裝起來,非常符合傳統(tǒng)的視頻編碼標(biāo)準(zhǔn),起始碼的字長可以是16b或24b,這依賴于該NALU載荷的重要性。起始碼字僅會(huì)出現(xiàn)在十字節(jié)對準(zhǔn)的位置上,因此解碼器可以掃描起始碼字,用一種簡單的u1向字節(jié)的內(nèi)存復(fù)制操作把NALUs提取出來。
為了防止字節(jié)流格式中的起始碼字發(fā)生競爭現(xiàn)象,許多視頻編碼標(biāo)準(zhǔn)都非常謹(jǐn)慎地采用熵編碼方式。由于JVT標(biāo)準(zhǔn)包含兩種不同的熵編碼模式,所以這種起始碼字很少發(fā)生競爭現(xiàn)象。JVT依靠一種字節(jié)填充機(jī)制,即通過在NALU中可能產(chǎn)生起始碼字競爭的位置上插入非零字節(jié)來避免出現(xiàn)競爭現(xiàn)象。為方便網(wǎng)關(guān)設(shè)計(jì),在一些看起來不必要的環(huán)境,尤其是包傳輸網(wǎng)絡(luò)中仍然執(zhí)行字節(jié)填充。由于VCL-NAL接口僅僅是概念上的,所以為防止起始碼字競爭,操作習(xí)慣上將其作為VCL熵編碼的一部分執(zhí)行。
H.264視頻流在誤碼、丟包多發(fā)的IP網(wǎng)絡(luò)上傳輸,增強(qiáng)了H.264視頻流的魯棒性。為了減少傳輸差錯(cuò),H.264視頻流中的時(shí)間同步可以通過采用幀內(nèi)圖像刷新來完成??臻g同步由條結(jié)構(gòu)編碼(SliceStruc-turedCoding)來支持,同時(shí)為了便于誤碼以后的再同步,在一幀的視頻數(shù)據(jù)中還提供了一定的重同步點(diǎn)。另外,幀內(nèi)宏塊刷新和多參考幀模式可以使編碼器在決定宏塊模式時(shí)不僅考慮編碼效率,還考慮傳輸信道的特性。H.264中還定義了數(shù)據(jù)分割模式:圖像首先進(jìn)行分段,段內(nèi)宏塊數(shù)據(jù)劃分為宏塊頭信息、運(yùn)動(dòng)矢量和DCT系數(shù)三部分,且三部分之間由標(biāo)識符分隔。這樣,解碼器可較方便地檢測出受損數(shù)據(jù)的類型,減少誤碼對圖像質(zhì)量造成的損傷。這種數(shù)據(jù)分割的模式也利于信道編碼時(shí)進(jìn)行不等保護(hù),即對重要的數(shù)據(jù)進(jìn)行等級較高的保護(hù)??焖俅a率控制可通過在宏塊層改變量化精度予以實(shí)現(xiàn)。
3nH.264的性能分析
通過實(shí)驗(yàn)來測試H.264的編碼性能,并通過與H.263的比較,觀察H.264的編碼效率。
3.1nH.264與H.263編碼性能比較
本試驗(yàn)對Grenadier Guards序列進(jìn)行測試,分別對H.264和H.263編碼的保真度、PSNR、宏塊編碼比特?cái)?shù)進(jìn)行比較,結(jié)果如下:
(1)保真度測試
通過殘差比較可以很清楚地看出,H.264重構(gòu)幀和參考幀的殘差比較平滑,基本沒有斑點(diǎn);而H.263的殘差比較明顯,尤其是在人物附近,由于運(yùn)動(dòng)量大,H.263使用半像素運(yùn)動(dòng)矢量估計(jì),而H.264提高到1/4像素,在1/4像素的基礎(chǔ)上再內(nèi)插,得到1/8像素精度的運(yùn)動(dòng)矢量,大大提高了圖像編碼的質(zhì)量,如圖2所示。
(2)PSNR測試(如圖2)
相對于H.263視頻編碼標(biāo)準(zhǔn),H.264在其增強(qiáng)預(yù)測編碼內(nèi)容的方法上做了改進(jìn),如場、幀編碼的自適應(yīng)選擇;變尺寸方塊的運(yùn)動(dòng)補(bǔ)償;高精度的運(yùn)動(dòng)補(bǔ)償;多參考幀運(yùn)動(dòng)補(bǔ)償;加權(quán)預(yù)測;整數(shù)變換;自適應(yīng)熵編碼;環(huán)路去塊濾波等,這些大大提高了H.264的PSNR。由圖2可以看出,無論是亮度信號,還是色差信號,H.264的PSNR都比H.263的高。
(3)宏塊編碼比特?cái)?shù)
下面對H.264和H.263進(jìn)行更直觀的比較,如圖3所示,色條從藍(lán)到紅變化,表示比特?cái)?shù)的逐漸增加。比較結(jié)果如圖4,圖5所示。
對GrerladieGuards序列中第3幀圖像的宏塊進(jìn)行4×8編碼,每一個(gè)宏塊所用的比特?cái)?shù)都可以清楚地看出。通過比較發(fā)現(xiàn),H.264對宏塊編碼所用的比特?cái)?shù)比H.263平均少50%。尤其在運(yùn)動(dòng)物體附近,效果更加明顯,H.264使用了很多偏紅的色塊,而H.264更多的是偏藍(lán)色塊?;眷o止的背景圖案,兩者也有很多的差別。由此可見,H.264中很多是深藍(lán)色的宏塊,所用的比特?cái)?shù)在10比特左右,而H.263則偏向綠色,比特?cái)?shù)在20比特左右。通過比較還發(fā)現(xiàn),H.264的編碼效率比H.263高很多。
3.2 H.264編碼性能
3.2.1 多參考幀預(yù)測模式
對于多種類型的視頻序列來說,多參考幀預(yù)測模式可以有效地提高編碼性能,它通過在運(yùn)動(dòng)矢量中增加一個(gè)時(shí)域部分,而允許在宏塊級下從若干參考幀中選擇其中的一個(gè)。由于需要保持一個(gè)參考幀緩沖區(qū)域,因此增加了在編解碼器中對內(nèi)存的需求量。另外,額外參考幀的引入也使得搜索區(qū)域擴(kuò)大,從而顯著提高了編碼器端在運(yùn)動(dòng)估計(jì)過程中計(jì)算的復(fù)雜度。本實(shí)驗(yàn)中Foreman視頻序列使用UVLC熵編碼,1/4像素運(yùn)動(dòng)矢量精度,搜索范圍為16像素。
圖6為使用不同參考幀數(shù)M對亮度分量峰值信噪比的影響。
試驗(yàn)表明,多參考幀的使用,能平均節(jié)省10%的比特率。同樣,多參考幀的使用也與具體的序列內(nèi)容有關(guān),高比特率的序列將大大提高圖像的PSNR。
3.2.2 雙向預(yù)測模式
H.264以前的視頻編碼標(biāo)準(zhǔn)一般都采用多假設(shè)預(yù)測模式,而H.264使用的雙向預(yù)測模式,它是一對前向/后向預(yù)測幀的線性組合。前后向預(yù)測又都可以包含多個(gè)參考幀,同時(shí),它又分為雙向預(yù)測信號的獨(dú)立估計(jì)和聯(lián)合估計(jì)。其中,聯(lián)合估計(jì)可以大大改進(jìn)編碼的效率。
本實(shí)驗(yàn)中Foreman視頻序列使用UVLC熵編碼,1/4像素運(yùn)動(dòng)矢量精度,搜索范圍為16像素。圖7為使用獨(dú)立估計(jì)和聯(lián)合估計(jì)對亮度分量峰值信噪比的影響。圖7是重構(gòu)B幀時(shí)幀比特率與亮度分量峰值信噪比的關(guān)系,選擇5個(gè)前向預(yù)測幀和3個(gè)后向預(yù)測幀,則由圖可以看出,聯(lián)合估計(jì)的性能比獨(dú)立估計(jì)的高。線性雙向預(yù)測模式不僅利用了抑止噪聲的組件,還提供了消除波峰的功能。假設(shè)當(dāng)前幀中有一個(gè)物體將在后續(xù)幀中出現(xiàn),而未在前面的幀中出現(xiàn),那么,增加前向參考幀就不能提高編碼效率,而增加后向參考幀就能大大提高編碼效率。
3.2.3 熵編碼
H.264有兩種不同的熵編碼模式:通用可變長編碼(UVLC)和基于上下文的自適應(yīng)二進(jìn)制算術(shù)編碼(CABAC)。UVLC只使用一個(gè)可變長的代碼去編碼所有二進(jìn)制的語法元素,而CABAC則采用上下文模式和基于條件概率與符號統(tǒng)計(jì)的自適應(yīng)算法。UVLC算法簡單,在付出很低的計(jì)算成本時(shí)就能取得很好的壓縮效率。CABAC計(jì)算復(fù)雜度高,但它能夠大大節(jié)省比特率。
本實(shí)驗(yàn)中Foreman視頻序列使用1/4像素運(yùn)動(dòng)矢量精度,搜索范圍為16像素。圖8為使用UVLC和CABAC對亮度分量峰值信噪比的影響。
試驗(yàn)表明,CABAC能大大降低比特率,在取得相同的亮度分量峰值信噪比時(shí),CABAC比UVCL平均節(jié)省15%的比特率。在高比特率的序列中,常使用多參考幀和CABAC聯(lián)合編碼,多參考幀能提高運(yùn)動(dòng)估計(jì)補(bǔ)償?shù)男剩珻ABLC能自適應(yīng)地根據(jù)上下文進(jìn)行熵編碼,從而大大提高編碼器的性能。
4 結(jié)語
文章對新一代視頻編碼標(biāo)準(zhǔn)H.264/AVC進(jìn)行全面的分析和研究,總體上按照H.264/AVC結(jié)構(gòu)化的編碼思想,對分視頻編碼層和網(wǎng)絡(luò)適配層進(jìn)行了分析,特別對H.264/AVC的編碼中所采用的新技術(shù)進(jìn)行了仿真研究,如編碼的效率、多參考幀、通用可變長編碼(UVLC)和基于上下文的自適應(yīng)二進(jìn)制算術(shù)編碼(CABAC)、運(yùn)動(dòng)補(bǔ)償?shù)?,并給出實(shí)驗(yàn)結(jié)果,充分說明了新一代視頻編碼標(biāo)準(zhǔn)H.264/AVc的編碼效率比以前的編碼標(biāo)準(zhǔn)(如H.263)在編碼效率上提高了很多。當(dāng)然,新一代視頻編碼標(biāo)準(zhǔn)H.264/AVc雖然優(yōu)點(diǎn)明顯,但許多優(yōu)點(diǎn)是以犧牲計(jì)算復(fù)雜度換來的。因此在降低計(jì)算復(fù)雜度的同時(shí),能達(dá)到更高的編碼效率將是下一步研究的重點(diǎn)。
評論
查看更多