天天看點

視訊壓縮編碼和解碼

引言     視訊具有一系列的優點,如直覺性、确切性、高效性、廣泛性等等,但是資訊量太大,要是視訊得到有效的應用,必須首先解決視訊壓縮編碼問題,其次解決壓縮後視訊品質的保證問題。這兩者是互相沖突的兩個方面,如何既能達到較大的壓縮比,又要保證一定的視訊品質就是現在我們要解決的任務。 1. 視訊壓縮的目标:   視訊信号的傳輸由于資訊量大,傳輸網絡寬帶要求高,如果直接對視訊信号進行傳輸,以現在的網絡寬帶來看很難達到,是以就要求我們在視訊信号傳輸前先進行壓縮編碼,即進行視訊源壓縮編碼,然後再傳送以節省帶寬和存儲空間。對于視訊壓縮有兩個最基本的要求: 1.       必須壓縮在一定的帶寬内,即視訊編碼器應具有足夠壓縮比的功能。 2.       視訊信号壓縮之後,經恢複應保持一定的視訊品質。視訊品質有2個标準:一個為主觀品質,有人的視覺上進行評定;一個為客觀品質,用信噪比(S/N)表示。 信噪比(S/N)是指音箱回放的正常聲音信号與無信号時噪聲信号(功率)的比值。用dB表示。例如,某音箱的信噪比為80dB,即輸出信号功率比噪音功率大80dB。信噪比數值越高,噪音越小。 2. 視訊壓縮的可能性: 視訊圖像資料有極強的相關性,也就是說有大量的備援資訊。其中備援資訊可分為空域備援資訊和時域備援資訊。壓縮技術就是将資料中的備援資訊去掉(去除資料之間的相關性),壓縮技術包含幀内圖像資料壓縮技術、幀間圖像資料壓縮技術和熵編碼壓縮技術 一幅圖像是由很多的像素點組成的,如圖(1),大量統計表明,同一幅圖像中的像素之間有很強的相關性,兩像素之間的距離越短,則其相關性越強,即其像素值越接近。兩像素值發生突變的可能性就很小,相等相似或緩變得機率則極大。      

視訊壓縮編碼和解碼
視訊壓縮編碼和解碼

            圖(1)像素間相關性解釋                      圖(2)幀間相關性解釋 于是可以用像素直接的相關性進行壓縮編碼。如圖(1)中目前像素X(立即傳送像素),可以用前一個像素a、b或c,或三者的線性權重來預測。a、b、c被稱為參考像素。實際傳送時候,把實際像素X(目前值)和參考像素(預測值)相減,例如隻傳送X-a,到了接收端再把(X-a)+a恢複為X,由于a是已經傳送的(接收端被存儲),于是得到目前的X。由于a和X相似,(X-a )非常小,視訊信号被壓縮。這種被稱為幀内壓縮。 此外還可以進行如圖(2)的幀間的相關性進行壓縮。由于臨近幀之間的相關性比幀内像素間的像素相關性更強。可得到更大的壓縮比。`利用像素之間(幀内)的相關性和幀間的相關性,找到相應的參考像素或者參考幀作為預測,即可實作壓縮編碼。 變換編碼 視訊信号中包含能量上占主要部分的直流和低頻部分(圖像的平坦部分),還有少量的高頻部分,即圖像的細節。是以可以将圖像經過某種數學變換得到變換中的圖像(如圖3)其中U、V為空間頻率坐标。“o”表示低頻和直流成分占圖像能量中的大部分,高頻用“*”表示,需要用碼送的,占少量,其餘為零值,用“0”表示。

視訊壓縮編碼和解碼

圖3 于是可用較少的碼表示直流低頻以及高頻,而“0”則不必用碼傳遞,結果完成壓縮編碼。 視訊編碼系統的基本結構如圖4

視訊壓縮編碼和解碼

                       圖4視訊編碼系統 視訊編碼的方法和采用的資訊源有關,如果采用“一幅圖像由許多像素構成”的資訊源模型,這種信源模型的參數就是每個像素的亮度和色度的幅值。對這些的壓縮稱為基于波形的編碼。如果采用一個分量有幾個物體構成的信源模型,這種信源模型的參數是各種物體的形狀、紋理、運動。對這些參數進行壓縮的技術成為基于内容的編碼。 由此可見,根據采用的信源模型,視訊編碼分為兩大類:基于波形的編碼和基于内容的編碼。它們利用不同的壓縮編碼方法,得到相應的量化前的參數,再對這些參數進行量化,用二進制碼表示其量化值;最後進行誤傷編碼進一步壓縮碼率。解碼則為編碼的逆過程。 基于波形的編碼:利用像素的空間相關性和幀間的時間相關性,采用預編碼和變換編碼技術大大減少視訊信号的相關性,進而顯著減低視訊序列的碼率,實作編碼的目标。 基于内容的編碼:先把視訊幀分成對應于不同物體的區域,然後分别對其進行編碼,即對不同的物體的形狀、運動和紋理進行編碼。 視訊信号的備援資訊可分為空域備援資訊和時域備援資訊 去時域備援資訊   使用幀間編碼技術可去除時域備援資訊,它包括以下三部分:  1.運動補償 運動補償是通過先前的局部圖像來預測、補償目前的局部圖像,它是減少幀序列備援資訊的有效方法。 運動補償是目前視訊圖像壓縮技術中使用最普遍的方法之一。包括: 運動補償預測   視訊的相鄰幀間的運動部分具有連續性,即目前畫面上的圖像可以看成是前畫某時 刻畫面上圖像的位移,位移的幅度值和方向在畫面各處可以不同。利用運動位移資訊與 前面某時刻的圖像對目前畫面圖像進行預測的方法,稱為前向預測。反之,根據某時刻 的圖與位移資訊預測該時刻之前的圖像,稱為後向預測。 MPEG的運動補償将畫面分成若幹16×16的子圖像塊(稱為補償單元或宏塊),并根據一 定的條件分别進行幀内預測、前後預測、後向預測及平均預測。 運動補償插值     以插補方法補償運動資訊是提高視訊壓縮比的最有效措施之一。在時域中插補運動 補償是一種多分辨率壓縮技術。例如1/15秒或1/10秒時間隔選取參考子圖,對時域較 較低辨率子圖進行編碼,通過低分辨子圖反映運動趨勢的附加校正資訊(運動夭量)進行 插值,可得到滿分辨率(幀率1/30秒)的視訊信号。插值運動補償也稱為雙向預測,因 為它既利用了前面幀的資訊又利用了後面幀的資訊。 2.運動表示   不同區域的圖像需要使用不同的運動矢量來描述運動資訊。運動矢量通過熵編碼進行壓縮。   3.運動估計   運動估計是從視訊序列中抽取運動資訊的一整套技術運動向量的計算叫做運動估計。運動向量給出了目前幀和上一幀之間的運動位移關系,使目前幀的資訊能夠從上一幀推導得到。運動估計算法的結果準确性影響碼流的大小,而其運算複雜性影響幀率的快慢,這兩項名額都是實時視訊編碼效率的主要名額,都非常重要,是以運動估計的算法和實作成為MPEG4編碼效率的關鍵。 注:通用的壓縮标準都使用基于塊的運動估計和運動補償。   去空域備援資訊   主要使用幀間編碼技術和熵編碼技術:   - 變換編碼   幀内圖像和預測差分信号都有很高的空域備援資訊。變換編碼将空域信号變換到另一正交矢量空間,使其相關性下降,資料備援度減小。   - 量化編碼   經過變換編碼後,産生一批變換系數,對這些系數進行量化,使編碼器的輸出達到一定的位率。這一過程導緻精度的降低。   - 熵編碼 熵編碼是無損編碼。它對變換、量化後得到的系數和運動資訊,進行進一步的壓縮。   幾個重要的概念 幀:就是影像動畫中最小機關的單幅影像畫面,相當于電影膠片上的每一格鏡頭。 一幀就是一副靜止的畫面,連續的幀就形成動畫

視訊壓縮編碼和解碼

上圖中的5張圖檔其實就構成了一個簡單的茶壺旋轉的動畫,其中每一幅圖就是一幀,5幅圖檔連起來以後就構成了5幀的動畫。 關鍵幀:關鍵幀(Key Frame)是其他幀壓縮時與之比較并産生內插補點的基準。 可以以Flash中的幀為例來了解,在Flash中,關鍵幀是差別于過渡幀而言的,假如說過渡幀是動畫的話,那麼關鍵幀就應該是原畫。

視訊壓縮編碼和解碼

圖中幀标記為 1和2的是關鍵幀,而其他幀則是中間幀 。 視訊編碼壓縮中,關鍵幀可以不壓縮,而中間幀(也稱作內插補點幀)是根據其與關鍵幀的差異來壓縮的。采用關鍵幀壓縮可以使壓縮比更小而回放速率更快,但在一段視訊檔案中通路某一幀的時間将延長。該參數隻有在使用幀間壓縮編碼如幀間內插補點編碼時才起作用。如果不設定關鍵幀,則編碼器預設每一幀都是關鍵幀。 關鍵幀設定的标準 運動壓縮的關鍵是在于兩幀之間的差别大小。如果圖象隻有微小的變化,那麼經過作差後壓縮效果就好;如果圖像變化很大,那麼經過作差後壓縮效果就很差。為了充分利用運動壓縮的特點,我們根據圖像的性質來調節關鍵幀間的距離。在圖像變化不大的情況下,非關鍵幀資料較少,此時拉長關鍵幀間的距離可以降低傳輸率;在圖像變化較大的情況下,非關鍵幀資料較多,此時縮短關鍵幀間的距離增加運動補償的效果。 但是在視訊通信的情況下,即便隻丢失了單個的包,也可能會引起嚴重的問題。因為要以每秒大約30幀來表現全動态的視訊,需要大量的資料,實際上每段視訊都會使用資料壓縮來減少可管理的視訊流量。通常的做法是使用一個“關鍵幀”,它包含後續的大量視訊幀的完備視訊資訊,而後續的幀隻須将自己幀上不同于其他幀的資訊傳送給關鍵幀即可,進而大大減少了資料傳輸密度。但如果丢失的正好是這個關鍵幀,那麼一個小小的失誤也會變成大失誤。 三.兩個重要的标準 (1 )MPEG-4 标準 以MPEG-4為例對視訊編碼進行深入的了解。 MPEG-4的編碼理念是:MPEG-4标準同以前标準的最顯著的差别在于它是采用基于對象的編碼理念,即在編碼時将一幅景物分成若幹在時間和空間上互相聯系的視訊音頻對象,分别編碼後,再經過複用傳輸到接收端,然後再對不同的對象分别解碼,進而組合成所需要的視訊和音頻。這樣既友善我們對不同的對象采用不同的編碼方法和表示方法,又有利于不同資料類型間的融合,并且這樣也可以友善的實作對于各種對象的操作及編輯。 例如,我們可以将一個卡通人物放在真實的場景中,或者将真人置于一個虛拟的演播室裡,還可以在網際網路上友善的實作互動,根據自己的需要有選擇的組合各種視訊音頻以及圖形文本對象。 MPEG視訊 壓縮編碼後包括三種元素:I幀(I-frames)、P幀(P-frames)和B幀(B-frames)。在MPEG編碼的過程中,部分視訊 幀序列壓縮成為I幀;部分壓縮成P幀;還有部分壓縮成B幀。 I 幀法: I幀圖像采用幀内編碼方式,即隻利用了單幀圖像内的空間相關性,而沒有利用時間相關性。 I幀法是基于離散餘弦變換DCT( Discrete Cosine Transform )的壓縮技術,這種算法與JPEG壓縮算法類似。采用I幀壓縮可達到1/6的壓縮比而無明顯的壓縮痕迹。I幀為關鍵幀,記錄畫面完整資訊。 P 幀法/B 幀法   P幀和B幀圖像采用幀間編碼方式,即同時利用了空間和時間上的相關性。P幀圖像中可以包含幀内編碼的部分,即P幀中的每一個宏塊可以是前向預測,也可以是幀内編碼。P幀法是一種前向預測算法,它考慮相鄰幀之間的相同資訊或資料,也即考慮運動的特性進行幀間壓縮。P幀法是根據本幀與相鄰的前一幀(I幀或P幀)的不同點來壓縮本幀資料。B幀圖像采用雙向時間預測,可以大大提高壓縮倍數。P,B幀都是delta幀,記錄的是差分資訊,不完整必須參考I幀才可以複原畫面。是以切割的起始點一定要從關鍵幀開始。 (2 )H.264 标準 H.264标準的主要目标是:與其它現有的視訊編碼标準相比,在相同的帶寬下提供更加優秀的圖象品質。 H.264與以前的國際标準如H.263和MPEG-4相比,最大的優勢展現在以下四個方面: 1.将每個視訊幀分離成由像素組成的塊,是以視訊幀的編碼處理的過程可以達到塊的級别。 2.采用空間備援的方法,對視訊幀的一些原始塊進行空間預測、轉換、優化和熵編碼(可變長編碼)。 3.對連續幀的不同塊采用臨時存放的方法,這樣,隻需對連續幀中有改變的部分進行編碼。該算法采用運動預測和運動補償來完成。對某些特定的塊,在一個或多個已經進行了編碼的幀執行搜尋來決定塊的運動向量,并由此在後面的編碼和解碼中預測主塊。 4.采用剩餘空間備援技術,對視訊幀裡的殘留塊進行編碼。例如:對于源塊和相應預測塊的不同,再次采用轉換、優化和熵編碼。 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編碼,視編碼器的設定而定。

4. 視訊解碼 當視訊經過壓縮傳輸後我們需要經過視訊的解碼來釋放壓縮過的視訊,重建圖像。 這就需要視訊解碼器的出場了。 NAL解碼器: H.264包含視訊編碼層(VCL)和網絡提取層(NAL)。VCL包括核心壓縮引擎和塊、紅塊及片的文法級别的定義,它涉及的目标是在盡可能的獨立于網絡的情況下進行高效的編解碼。  NAL解碼器負責符合H.264碼流規範的壓縮視訊流解碼,并進行圖像重建。基本的解 碼流程圖如圖5,流程如下:

視訊壓縮編碼和解碼

     解碼器從NAL中接受壓縮的比特流,經過對碼流進行熵解碼獲得一系列量化系數X;這些系數經過反變換和反量化得到殘差資料D;解碼器使用從碼流中解碼得到的頭資訊進行建立一個預測塊FRED,FRED與殘差資料D求和得到圖像塊資料uF;最後每個uF通過去方塊濾波得到重建圖像的解碼塊F。    以上是針對H.264 壓縮編碼的解碼過程。 及主要算法 MPEG-4采用了基于對象的壓縮編碼技術。在編碼前,首先要對視訊序列進行分析,從原理圖像中分割出各個視訊對象,然後南分别對每個視訊對象單獨編碼。每個對象都有自己的形狀資訊(shape)、運動資訊(motion)、紋理資訊(texture)。對視訊對象的編碼就是對這3種資訊進行編碼。MPEG-4通過運動預測和運作補償來去除連續幀之間的時間備援。運動預測與運動補償的精度可以為整像素、半像素或1/4像素,另外還增了重疊運動補償方式。與形狀相關算法有:基于鄰近資訊的算術編碼、水準和垂直填補、擴張填補等。 對于MPEG-4視訊碼流的解碼有如下一個簡圖

視訊壓縮編碼和解碼

JPEG解碼算法原理

  JPEG壓縮是一種有損壓縮。它利用人的視角系統特性,使用量化和無損壓縮編碼相結合的方式去掉視角的備援資訊和資料本身的備援資訊來達到壓縮的目的。JPEG算法可分為基本JPEG(Baseline system)和擴充JPEG(Extended system)。其中Baseline system應用尤其廣泛。本文主要讨論Baseline system的解碼。JPEG解碼算法框圖如圖所示。

視訊壓縮編碼和解碼

  (1)顔色空間變換

  JPEG算法本身與顔色空間無關,是以“RGB到YUV變換”和“YUV到RGB變換”不包含在JPEG算法中。但由于作為輸出的位圖資料一般要求RGB的表示,是以将顔色空間變換也表示在算法框圖中。

  (2)JPEG的編解碼單元

  在JPEG中,對于圖像的編解碼是分塊進行的。整個圖像被劃分為若幹個8×8的資料塊,稱為最小編碼單元(MCU),每一個塊對應于原圖像的一個8×8的像素陣列; 各行的編解碼順序是從上到下,行内的編解碼順序是從左到右。

  值得注意的是,由于一幅圖像的高和寬不一定是MCU尺寸的整數倍,是以需要對圖像的最右邊一列或其最下邊一行進行填充,擴充其高或寬,使得可以将整個圖像劃分為整數個MCU;而在解碼輸出時,這些複制的行列是要被抛棄的。

  (3)熵解碼器

  在JPEG的熵編碼時,首先利用空間相關性對各塊的直流值采用差分編碼,即對相鄰塊之間的直流內插補點編碼,以達到壓縮碼長的目的。然後對于交流部分以ZigZag方式掃描塊中的元素,對塊内元素采用先遊程編碼後哈夫曼編碼的混合編碼方式,得到一維二進制塊碼流。熵編碼過程是由直流部分的差分編碼和交流部分的ZigZag掃描、遊程編碼、哈夫曼編碼組成。而相應的熵解碼過程是編碼的逆過程,在解碼端接收到的是由變長碼(VLC)和變長整數(VLI)組成的資料流。為了從此資料流中恢複編碼前的DCT系數,必須根據哈夫曼編碼的原理及其各級碼表生成的細節,生成哈夫曼解碼表,再根據解碼算法來恢複DCT的直流和交流系數。

   (4)反量化

  在JPEG解碼端要利用發送過來的量化表對量化值進行譯碼。JPEG檔案裡一般含有兩個量化表:一個亮度分量的量化表,一個色度分量的量化表。反量化就是對熵解碼出來的系數矩陣乘上相應的量化矩陣:

視訊壓縮編碼和解碼

其中,C(u,v)代表熵解碼輸出,Q(u,v)代表相應的量化矩陣。

   (5)IDCT變換

  JPEG解碼算法能否滿足實時應用,關鍵在于8×8的二維IDCT的計算速度。在編碼階段,正向離散餘弦變換(FDCT)把空間域表示的圖變換成頻率域表示的圖;相應

地在解碼階段,逆向離散餘弦變換(IDCT)将頻率域表示的圖變換為空間域表示的圖。   在IDCT的實作上,目前有多種算法。傳統的方法是行-列法,即先對每行(列)進行一維IDCT計算,再對每列(行)進行一維IDCT計算。還有多項式變換法和三角函數公式法,這兩種方法的加法次數與行-列法相當,乘法次數僅為行-列法的一半。但這兩種方法的問題在于實作方法複雜,對于目标平台(VLIW)來說,這樣的結構難以提高指令的并行性,并且對于目标平台來說,乘法指令的執行時間與加法指令相當,是以減少了行-列法實作的代價。  

總結 對于視訊的壓縮編碼的整個發展過程經曆很多的壓縮編碼标準,現在最先進的壓縮編碼标準 H264/AVC,H264集中了以往标準的優點,并吸收了以往标準制定中積累的經驗, 采用簡潔設計,使它比MPEG4更容易推廣。 解碼方面以H.264/AVC和MPEG4以及JPEG的解碼原理實作為例,簡單介紹一下視訊解碼的基本過程。  

繼續閱讀