H.264編碼技術

一、H.264的制定過程和應用場合

在制訂完最初的H.263標準之後,ITU-T的視頻編碼專家組(VCEG)將開發工作分爲兩部分:一部分稱之爲“短期(short-term)”計劃,目的是給H.263增加一些新的特性(這一計劃開發出了H.263+和H.263++);另一部分被稱爲“長期(long-term)”計劃,其最初的目標就是要制定出一個比當時其他的視頻編碼標準效率提高一倍的新標準。這一計劃在1997年開始,其成果就是作爲H.264前身的H.26L(起初叫H.263L)。在將近2001年底,由於H.26L優越的性能,ISO/IEC的MPEG專家組加入到VCEG中來,共同成立了聯合視頻小組(JVT),接管了H.26L的開發工作。這個組織的目標是:“研究新的視頻編碼算法,其目標是在性能上要比以往制定的最好的標準提高很多。”

這一標準正式成爲國際標準是2003年3月在泰國Pattaya舉行的JVT第7次會議上通過的。由於該標準是由兩個不同的組織共同制定的,因此有兩個不同的名稱:在ITU-T中,它的名字叫H.264;而在ISO/IEC中,它被稱爲MPEG-4的第10部分,即高級視頻編碼(AVC)。

H.264的應用場合相當廣泛,包括可視電話(固定或移動)、實時視頻會議系統、視頻監控系統、因特網視頻傳輸以及多媒體信息存儲等。

目前在國際上,加拿大的UB Video公司開發出了一套基於TMS320C64x系列的H.26L實時視頻通信系統,它可以在160kbit/s的碼率下獲得與H.263+在320kbit/s下相同的圖像質量。另一家加拿大的公司VideoLocus通過在系統中插入一塊基於FPGA的硬件擴展卡,在P4平臺上實現了H.264的實時編解碼。

二、 H.264的特點

H.264在編碼框架上還是沿用以往的MC-DCT結構,即運動補償加變換編碼的混合(hybrid)結構,因此它保留了一些先前標準的特點,如不受限制的運動矢量(unrestricted motion vectors),對運動矢量的中值預測(median prediction)等。然而,以下介紹的技術使得H.264比之前的視頻編碼標準在性能上有了很大的提高。應當指出的是,這個提高不是單靠某一項技術實現的,而是由各種不同技術帶來的小的性能改進而共同產生的。

1. 幀內預測

對I幀的編碼是通過利用空間相關性而非時間相關性實現的。以前的標準只利用了一個宏塊(macroblock)內部的相關性,而忽視了宏塊之間的相關性,所以一般編碼後的數據量較大。爲了能進一步利用空間相關性,H.264引入了幀內預測以提高壓縮效率。簡單地說,幀內預測編碼就是用周圍鄰近的像素值來預測當前的像素值,然後對預測誤差進行編碼。這種預測是基於塊的,對於亮度分量(1uma),塊的大小可以在16×16和4×4之間選擇,16×16塊有4種預測模式,4×4塊有9種預測模式;對於色度分量(chroma),預測是對整個8×8塊進行的,有4種預測模式。除了DC預測外,其他每種預測模式對應不同方向上的預測。

2. 幀間預測

與以往的標準一樣,H.264使用運動估計和運動補償來消除時間冗餘,但是它具有以下五個不同的特點:

(1)預測時所用塊的大小可變

由於基於塊的運動模型假設塊內的所有像素都做了相同的平移,在運動比較劇烈或者運動物體的邊緣處這一假設會與實際出入較大,從而導致較大的預測誤差,這時減小塊的大小可以使假設在小的塊中依然成立。另外小的塊所造成的塊效應相對也小,所以一般來說小的塊可以提高預測的效果。

爲此,H.264一共採用了7種方式對一個宏塊進行分割,每種方式下塊的大小和形狀都不相同,這就使編碼器可以根據圖像的內容選擇最好的預測模式。

與僅使用16×16塊進行預測相比,使用不同大小和形狀的塊可以使碼率節省15%以上。

(2)更精細的預測精度

在H.264中,Luma分量的運動矢量(MV)使用1/4像素精度。Chroma分量的MV由luma MV導出,由於chroma分辨率是luma的一半(對4:2:0),所以其MV精度將爲1/8,這也就是說1個單位的chroma MV所代表的位移僅爲chroma分量取樣點間距離的1/8。如此精細的預測精度較之整數精度可以使碼率節省超過20%。

(3)多參考幀

H.264支持多參考幀預測(multiple reference frames),即可以有多於一個(最多5個)的在當前幀之前解碼的幀可以作爲參考幀產生對當前幀的預測(motion-compensated prediction)。這適用於視頻序列中含有週期性運動的情況。採用這一技術,可以改善運動估計(ME)的性能,提高H.264解碼器的錯誤恢復能力,但同時也增加了緩存的容量以及編解碼器的複雜性。不過,H.264的提出是基於半導體技術的飛速發展,因此這兩個負擔在不久的將來會變得微不足道。較之只使用一個參考幀,使用5個參考幀可以節省碼率5~10%。

(4)抗塊效應濾波器

抗塊效應濾波器(Deblocking Filter),它的作用是消除經反量化和反變換後重建圖像中由於預測誤差產生的塊效應,即塊邊緣處的像素值跳變,從而一來改善圖像的主觀質量,二來減少預測誤差。H.264中的Deblocking Filter還能夠根據圖像內容做出判斷,只對由於塊效應產生的像素值跳變進行平滑,而對圖像中物體邊緣處的像素值不連續給予保留,以免造成邊緣模糊。與以往的Deblocking Filter不同的是,經過濾波後的圖像將根據需要放在緩存中用於幀間預測,而不是僅僅在輸出重建圖像時用來改善主觀質量,也就是說該濾波器位於解碼環中而非解碼環的輸出外,因而它又稱作Loop Filter。需要注意的是,對於幀內預測,使用的是未經過濾波的重建圖像。

3.整數變換

H.264對幀內或幀間預測的殘差(residual)進行DCT變換編碼。爲了克服浮點運算帶來的硬件設計複雜,更重要的是舍入誤差造成的編碼器和解碼器之間不匹配(mismatch)的問題,新標準對DCT的定義做了修改,使得變換僅用整數加減法和移位操作即可實現,這樣在不考慮量化影響的情況下,解碼端的輸出可以準確地恢復編碼端的輸入。當然這樣做的代價是壓縮性能的略微下降。此外,該變換是針對4×4塊進行的,這也有助於減少塊效應。

爲了進一步利用圖像的空間相關性,在對chroma的預測殘差和16×16幀內預測的預測殘差進行上述整數DCT變換之後,標準還將每個4×4變換系數塊中的DC係數組成2×2或4×4大小的塊,進一步做哈達瑪(Hadamard)變換。

4.熵編碼

如果是Slice層預測殘差,H.264有兩種熵編碼的方式:基於上下文的自適應變長碼(Context-based Adaptive Variable Length Coding,CAVLC)和基於上下文的自適應二進制算術編碼(Context-based Adaptive Binary Arithmetic Coding,CABAC);如果不是預測殘差,H.264採用Exp-Golomb碼或CABAC編碼,視編碼器的設置而定。

(1)CAVLC

VLC的基本思想就是對出現頻率大的符號使用較短的碼字,而出現頻率小的符號採用較長的碼字。這樣可以使得平均碼長最小。

在CAVLC中,H.264採用若干VLC碼錶,不同的碼錶對應不同的概率模型。編碼器能夠根據上下文,如周圍塊的非零係數或係數的絕對值大小,在這些碼錶中自動地選擇,最大可能地與當前數據的概率模型匹配,從而實現了上下文自適應的功能。

(2)CABAC

算術編碼是一種高效的熵編碼方案,其每個符號所對應的碼長被認爲是分數。由於對每一個符號的編碼都與以前編碼的結果有關,所以它考慮的是信源符號序列整體的概率特性,而不是單個符號的概率特性,因而它能夠更大程度地逼近信源的極限熵 ,降低碼率。

爲了繞開算術編碼中無限精度小數的表示問題以及對信源符號概率進行估計,現代的算術編碼多以有限狀態機的方式實現,H.264的CABAC便是一個例子,其他的例子還有JPEG2000。在CABAC中,每編碼一個二進制符號,編碼器就會自動調整對信源概率模型(用一個“狀態”來表示)的估計,隨後的二進制符號就在這個更新了的概率模型基礎上進行編碼。這樣的編碼器不需要信源統計特性的先驗知識,而是在編碼過程中自適應地估計。顯然,與CAVLC編碼中預先設定好若干概率模型的方法比較起來,CABAC有更大的靈活性,可以獲得更好的編碼性能——大約10%碼率的降低。

以上介紹的特點都是用來提高H.264的編碼性能的,此外H.264還具有很好的錯誤恢復能力(error resilience)和網絡適應性(network adaptability),下面介紹其中的一些特點。

5. SP Slice

SP Slice的主要目的是用於不同碼流的切換(switch),此外也可用於碼流的隨機訪問、快進快退和錯誤恢復。這裏所說的不同碼流是指在不同比特率限制下對同一信源進行編碼所產生的碼流。設切換前傳輸碼流中的最後一幀爲Al,切換後的目標碼流第一幀爲B2(假設是P幀),由於B2的參考幀不存在,所以直接切換顯然會導致很大的失真,而且這種失真會向後傳遞。一種簡單的解決方法就是傳輸幀內編碼的B2,但是一般I幀的數據量很大,這種方法會造成傳輸碼率的陡然增加。根據前面的假設,由於是對同一信源進行編碼,儘管比特率不同,但切換前後的兩幀必然有很多相關性,所以編碼器可以將Al作爲B2的參考幀,對B2進行幀間預測,預測誤差就是SP Slice,然後通過傳遞SP Slice完成碼流的切換。與常規P幀不同的是,生成SP Slice所進行的預測是在Al和B2的變換域中進行的。SP Slice要求切換後B2的圖像應和直接傳送目標碼流時一樣。顯然,如果切換的目標是毫不相關的另一碼流,SP Slice就不適用了。

6.靈活的宏塊排序

靈活的宏塊排序(flexible macroblock ordering,FMO),是指將一幅圖像中的宏塊分成幾個組,分別獨立編碼,某一個組中的宏塊不一定是在常規的掃描順序下前後連續,而可能是隨機地分散在圖像中的各個不同位置。這樣在傳輸時如果發生錯誤,某個組中的某些宏塊不能正確解碼時,解碼器仍然可以根據圖像的空間相關性依靠其周圍正確譯碼的像素對其進行恢復。

三、H.264的具體內容

通過上面的介紹,毋庸置疑,H.264在壓縮性能上要比其他標準優越,甚至包括MPEG-4(2)(MPEG-4第2部分)。衆所周知,MPEG-4(2)最大的特點就是面向對象的編碼,對象概念的提出是具有先進性的,在對象已經提取出來的條件下確實能夠獲得很高的壓縮比,但是如何提取對象成爲擺在人們面前的一大難題。一個真正的對象提取算法應該是像人一樣具有智能,能夠像人一樣進行思維並且是能夠學習的,而目前的技術根本達不到這點,雖然有大量的文獻介紹對象提取的方法,但我認爲這些只是權宜之計,充其量只是往正確的方向上邁出的一小步。正因爲如此,MPEG-4(2)面向對象編碼的思想過於超前。ITU-T的VCEG放棄了對象這一不現實的概念,與目前科學技術的發展水平相適應,提出了H.264(10)(MPEG-4第10部分)(H.26L)視頻編碼標準,這是難能可貴的,更重要的是它同樣實現了MPEG-4(2)面向對象編碼的目標之一——高壓縮比。

視頻信號的數據量是很大的,爲了達到高效的壓縮,必須充分利用各種冗餘,一般來講,視頻序列裏的冗餘包括兩類,一類是統計冗餘,它包含:(1)頻譜冗餘,指色彩分量之間的相關性;(2)空間冗餘;(3)時間冗餘,這是視頻壓縮區別於靜止圖像壓縮的根本點,視頻壓縮主要利用時間冗餘來實現大的壓縮比。第二類是視覺生理冗餘,這是由於人類的視覺系統(HVS)特性造成的,比如人眼對色彩分量的高頻分量沒有對亮度分量的高頻分量敏感,對圖像高頻(即細節)處的噪聲不敏感等。

針對這些冗餘,視頻壓縮算法採用了不同的方法加以利用,但主要的考慮集中在空間冗餘和時間冗餘上。與以前的標準類似,H.264也採用了所謂的混合(hybrid)結構,即對空間冗餘和時間冗餘分別進行處理。對空間冗餘,標準通過變換及量化達到消除的目的,這樣編碼的幀叫做I幀;而時間冗餘則是通過幀間預測,即運動估計和補償來去除的,這樣編碼的幀叫做P幀或B幀。

與以前的標準不同的是,H.264在編碼I幀時,採用了幀內預測,然後對預測誤差進行編碼。這樣就充分利用了空間相關性,提高了編碼效率。H.264的幀內編碼框圖(詳圖請參見《中國多媒體視訊》第七期)所示。 H.264幀內預測以16×16的宏塊爲基本單位。首先,編碼器將與當前宏塊同一幀的鄰近像素作爲參考,產生對當前宏塊的預測值,然後對預測殘差進行變換與量化,再對變換與量化後的結果做熵編碼。熵編碼的結果就可以形成碼流了。由於在解碼器端能夠得到的參考數據都是經過反變換與反量化後的重建圖像,所以爲了使編解碼一致,編碼器端用於預測的參考數據就和解碼器端一樣,也是經過反變換與反量化後的重建圖像。需要注意的一點是,用於幀內預測的這些參考數據不需要經過Deblocking Filter濾波,這與幀間編碼的參考圖像是不同的。

1、幀內預測

亮度Intra--16×16幀內預測模式如圖(詳圖請參見《中國多媒體視訊》第七期)所示。

亮度Intra--16×16幀內預測模式

色差分量的8×8 4種幀內預測模式如圖(詳圖請參見《中國多媒體視訊》第七期)所示。

色差分量的8×8 4種幀內預測模式

亮度分量的4×4 8種方向幀內預測模式。

圖5亮度分量的4×4 8種方向幀內預測模式

2、 變換與量化

將圖像的當前像素值與預測值相減,就形成了預測殘差。殘差內仍然含有空間冗餘,爲了消除這種冗餘,通常採用變換編碼,即變換——量化——熵編碼三步。變換並不壓縮數據,它只是消除數據中的相關性,或者說將數據中的冗餘(或相關性)以一種便於隨後進行熵編碼的方式表現出來。壓縮是在量化和熵編碼步驟中完成的。此外爲了進一步減少數據量,編碼器還對變換後的係數進行量化,它的實質是減少數據的取值範圍以減少每一個符號的熵。它會造成信息的損失,是有損編碼的一個重要步驟,它也是控制圖像率失真(R-D)特性的一個主要手段。在H.264中,變換與量化兩個步驟緊密相連。

整數DCT正變換的公式

H.264的反DCT變換公式

圖像編碼中常用的變換是DCT,因爲它在某種條件下近似於理論上最優的K-L變換。但是如果直接採用DCT的定義進行變換,會帶來兩個問題:一個是需要進行浮點數操作,從而造成系統設計上的複雜性;第二,由於變換核都是無理數,而有限精度的浮點數不可能精確地表示無理數,再加上浮點數的運算可能會引入舍入誤差,這就使得在具體實現時會導致編解碼的不一致(mismatch),即反變換的輸出結果和正變換的輸入不一樣。爲了克服這些問題,H.264採用整數DCT變換,使得變換操作僅用整數加減和移位操作就可以完成,這樣既降低了設計複雜度,又避免了編解碼mismatch,而由此帶來的編碼性能的減少微乎其微。需要注意的是,此時的變換已經不是真正的DCT,仍然稱其爲DCT變換只是爲了說明它是由DCT推導而來,且爲了和另一個變換(Hadamard變換)相區別罷了。

H.264編碼器的變換與量化過程見七期雜誌。圖中輸入爲預測殘差,輸出爲準備進行熵編碼的數據,一共有五類。爲了更大程度地利用空間冗餘,對於Intra 16×16幀內預測模式,H.264在對16×16的hma分量的16個4×4塊進行DCT變換後,將每個4×4塊的DC係數(還沒有經過量化)提取出來,組成一個4×4的luma DC塊,對其再進行4×4的哈達瑪(Hadamard)變換。同樣,對8×8 chroma分量的4個4×4塊進行DCT變換後,也將每個4×4塊的DC係數提取出來,組成一個2×2的chroma DC塊,對其進行2×2的Hadamard變換,如圖7所示。圖中的數字顯示的是所代表的塊在碼流中的順序。對亮度分量直流係數的附加的(4×4)4階Hadamard變換 對色度分量直流係數進行附加的(2×2)2階Hadamard變換 DC係數的處理如圖(詳圖請參見《中國多媒體視訊》第七期)所示。

圖中的輸入是經過解碼(CAVLC或CABAC)後的結果,輸出的數據加上預測值後成爲重建圖像,重建圖像用於幀內預測,或經過Deblocking Filter後顯示並根據需要存放於緩存中,用於幀間預測。這裏有一個地方需要注意,對於DC係數(無論是Intra 16×16 luma DC還是chroma DC),解碼器是先反變換再反量化,這樣做的原因在後面的內容中將做解釋。MUX是指將DC係數按圖8裝配到AC係數中,形成完整的4×4塊,用於後續的反DCT變換。

目前H.264的主要不足就是複雜度大,但隨着技術的不斷進步,特別是半導體技術的發展,芯片的處理能力和存儲器的容量都將會有很大的提高,所以今後H.264必然煥發出蓬勃的生命力,逐漸成爲市場的主角。

 
<script src="H_264編碼技術_files/show_ads.js" type="text/javascript"> </script>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章