[轉]MPEG-4視頻編解碼知識點

對於有着巨大信息量的視頻處理來講,須要研究出更高壓縮比、更低碼率、更清晰畫質的編解碼算法。到目前爲止,視頻編解碼的國際標準有MPEG-1,MPEG-2.MPEG-4,H.261,H.263,H.264等。算法

本課題選擇的解碼對象是MPEG-4標準碼流。之因此選擇MPEG-4碼流而非H.264碼流的緣由是:雖然H.264做爲新一代的視頻編解碼標準,在追求更高的編碼效率和簡潔的表達形式的同時,也提供了很是好的視頻質量,是當前最高效的視頻壓縮方法,可是因爲H.264中引入了多種新的編碼技術,使得編解碼器的計算量急劇增長,對基於手持設備和無線設備的編解碼系統來講並非一種理想的選擇,相比之下,基於簡單架構的(Simple Profile,SP)的MPEG-4 SP標準則很是適合此類系統。網絡

MPEG-4:MPEG-4標準的突出特色是對音視頻數據採用基於內容(Content-based)的操做、存取及傳輸。MPEG-4標準是一個開放、靈活、可擴展的結構形式,可隨時加入新的、有效的算法模板,並可根據不一樣的應用要求現場配置解碼器。數據結構

MPEG-4與MPEG-一、MPEG-2以及H.264相比,更注重多媒體系統的交互性和靈活性。最顯著的差異在於它採用基於對象的編碼理念;即在編碼時將一幅景物分紅若干個在時間和空間上相互聯繫的視頻音頻對象,分別編碼後通過複用傳輸到接收端,在接收端再對不一樣對象分別解碼。最後合成所需的視頻和音頻。這樣便於對不一樣對象進行不一樣的編碼和操做,也有利於不一樣數據類型間的融合。架構

它不但支持碼率低於64kbps的多媒體通訊,也能支持廣播電視級的視頻應用。MPEG-4將普遍地應用於數字電視、動態圖像、實時多媒體監控、基於內容存儲和檢索的多媒體系統、可視遊戲、基於面部模型的視頻會議、交互式多媒體應用、演播電視等,它將推進電信、計算機、廣播電視三大網絡的最終融合,從而成爲從此一段時間壓縮標準的主流。ide

MPEG-4針對不一樣應用可使用不一樣的編解碼工具,並同時提出了類(profile)的概念。一個類是能夠實現某個MPEG-4功能的一套工具子集。Profile使得用戶徹底能夠根據本身的須要來選擇使用相應的MPEG-4工具,而且在構建解碼器時也不須要爲全部MPEG-4中使用的編碼算法準備好相應的解碼算法。函數

MPEG-4標準中定義了不少視頻工具(visual tools),每一個視頻工具都完成一項編碼的工做。每一個類都有本身支持的視頻工具集,以適應各類環境下的使用。Simpile profile主要使用以下的視頻工具:工具

i.I幀編碼(I-VOP),內部VOP:只用本身的信息編碼。MPEG-4標準將8*8的象素區成爲塊(block),將16*16的像素區稱爲宏塊(macroblock)。I幀中只有intra塊,intra(幀內)塊只進行幀內壓縮。I幀是做爲預測基準的獨立幀,具備較小的壓縮比。性能

ii.P幀編碼(P-VOP),單向預測VOP: 根據它前面的VOP利用運動補償技術來編碼。P幀包含intra塊和inter塊,P幀中的inter(幀間)塊以本幀以前的圖像爲參考值作運動預測。因爲使用了單向的遠動預測,P幀能夠獲得中等的壓縮比。MPEG-4視頻中還有一種B幀(雙向預測VOP,B-VOP),使用之前和未來的兩幅圖像作雙向的運動預測,能夠獲得較高的壓縮比,但其計算量也是三種類型的幀中最大的。Simple profile不支持B幀。優化

四類VOP(Video Object Plane視頻對象平面):內部VOP(I-VOP)、單向預測VOP(P-VOP)、雙向預測VOP(B-VOP)、全景VOP(S-VOP)。編碼

iii.AC/DC預測(AC/DC Prediction)。AC/DC預測是以塊爲單位進行的。因爲圖像數據具備空間相關性,在intra塊編碼中,DCT變換後圖像左上方塊的直流/交流份量值(AC/DC)能夠用來預測右下方的塊的直流/交流份量值。

iv.數據分割(Data Partition)。在視頻數據編碼時,能夠將編碼後的數據分爲紋理,運動矢量和控制字三部分。在接收端,控制字出錯對解碼的影響最大,運動矢量次之,紋理影響最小。因爲對信道編碼來講,抗噪性好就意味着碼流中引入更多冗餘。因此,若是視頻數據信源編碼時將這三部分分開,分別使用不通的信道編碼方式,就能夠作到在低帶寬傳輸中儘量的提升抗噪性。

v. 反向VLC(Reversible VLC)。對於普通的VLC編碼,若是碼流中有一個bit出現錯誤,以後的數據都沒法解碼。反向VLC的碼錶通過特別設計,從反向也能夠完成解碼工做。因此,若是反相VLC編碼的數據在傳輸中出現了一個錯誤,能夠從VLC碼流的結尾向前解碼,一直解到出錯的bit,從而成功恢復出更多的碼流。反相VLC提升了編碼的抗噪性,但也付出了比普通VLC編碼效率更低的代價。

vi. 短頭(short header)。MPEG-4在編碼過程當中同加入不少的控制字做爲碼流的碼頭。若是使用短頭,許多控制字將被省略,解碼器會按照協議中固定的配置去解碼。短頭犧牲了一些編碼的靈活性,來換取編碼效率和編碼速度。

MPEG-4解碼就是根據碼流中控制信息,調用相應工具,對碼流操做的過程。

H.264:MPEG(運動圖像專家組)和VCEG(視頻編碼專家組)聯合開發了一個比早期研發的MPEG和H.263性能更好的視頻壓縮編碼標準,這就是被命名爲AVC(加強視頻編碼)。一般被簡稱爲H.264/AVC。視頻的各類應用必須經過網絡傳送,這要求一個好的視頻方案能處理各類應用和網絡接口H.264/AVC爲了解決這個問題,提供了不少靈活性和客戶化特性。H.264/AVC的設計方案包含兩個層次,視頻編碼層(VCL,Video Coding Layer)和網絡抽象層(NAL,Network Abstraction Layer)。視頻編碼層主要致力於有效地表示視頻內容,網絡抽象層格式化VCL視頻表示,提供頭部信息,適合多種傳輸和存儲媒體。H.264着重於解決壓縮的高效率和傳輸的高可靠性,其支持三個不一樣不一樣檔次的應用,應用場合至關普遍。其中基本檔次主要用於視頻會話,如會議電視,可視電話,遠程醫療,遠程教學;擴展檔次主要用於網絡的視頻流,如視頻點播;主要檔次主要用於消費電子應用,如數字電視廣播、數字視頻存儲等。可是要實現上述多種強大功能也致使了H.264的算法複雜度較高,不利於在手機終端等能力受限設備上的使用。

數字視頻基礎:

天然界是由多個有各自特徵形狀、深度、紋理和亮度的物體所組成。一個與視頻處理有關的典型天然視頻場景包括空間特性(物體的形狀、數目、紋理、顏色等)和時間特徵(物體的運動、視點的變換等)。而天然視頻場景在空間和時間上都是連續的,所以只要對天然場景的空間特徵和時間特徵進行採樣,咱們就能夠用數字的方式來表示一個視頻的場景。數字視頻就是在數字的形式下的一個視頻場景的採樣的表示。每個時-空採樣(像素)可用一個數或者是一組數來表示採樣點的亮度和色度。

攝像頭用於把一個視頻的場景投影到傳感器上,好比一組電荷耦合裝置(CCD)。在帶色的視頻採集中,每個顏色成員都被過濾並投影到一組CCD中。

空間採樣:在空間採樣中,一組CCD的輸出就是一個模擬的視頻信號,一組能夠表示視頻圖像的電信號。在一個時間點上的採樣就造成了一個有定值的採樣點圖像幀。最經常使用的採樣方法是把採樣點置於一個正方形或長方形格中進行操做。而後對於水平方向和垂直方向的點二維採樣,重建過程就以採樣值對應到像素上進行顯示。重建圖像時,視覺效果取決於採樣點的數暈。相同大小的圖像,採樣點的間隔較大就會獲得一個低分辨率的採樣圖像,而增長採樣點的數量就會增長採樣圖像的分辨率。

時間採樣: 在時間採樣中,一個運動的視頻圖像是經過對圖像信號在週期性的時間間隔上進行採樣獲得的。重放這一系列的幀會獲得一個運動的效果。一個高的時間採樣率(幀率)會產生更加平滑的運動,可是它就要求有更多的採樣要被捕捉並被保存。

在10幀/秒之下的幀率通常被用於一些很低碼率的視頻通訊中,由於被傳輸的數據量很是的小。可是運動卻看起來很笨拙並且不天然。在10-20幀每秒是比較經典的低碼率視頻。在25-30幀每秒進行採樣是標準電視信號圖象的採樣幀率,若是配合隔行掃描採樣來達到更好的運動效果。50-60幀每秒就能夠造成平滑的運動,這樣的代價就是幀率太太高,傳輸和存儲的壓力大。

顏色空間: 大多數字視頻程序都依賴於彩色視頻的顯示,所以須要一個來捕捉並表示顏色空間的方法。一個單色的圖像只須要一個在空間內表示一個像素點的亮度的值就能夠了。但對於彩色圖像來講,對於一個像素點至少須要三個數來把顏色信息準確地表示出來。顏色空間主要有RGB和YCbCr兩種表示方法。

RGB顏色空間:在RGB顏色空間中,一個帶顏色的圖像採樣是用三個值來表示一個像素點的相對的紅、綠和藍色比例。任何顏色均可以經過把紅、綠和藍來經過不一樣的比例相混獲得。RGB顏色空間更加適合於捕捉並顯示彩色圖像,可是因爲人類的視覺系統對亮度的敏感度大於顏色,而在RGB顏色空間中,三種顏色是被平等看待的,並用相同的分辨率存放起來。基於RGB顏色空間的相對缺點而提出的YCbCr顏色空間是經過把亮度和顏色信息分離,並對亮度值取更高分辨率能夠更有效的表示一幅彩色圖像。

YCbCr顏色空間和它的變換(一般寫爲YUV)是一種流行而高效的圖像表示方法,二者之間轉換方程以下:

Y=krR+kgG+kbB

Cb=B-Y

Cr=R-Y

Cg=G-Y

其中Y是亮度值,可由R,G和B的加權平均獲得。在YCbCr顏色空間中,一個圖像的完整描述可由給定Y和三個色差:Cb,Cr和Cg來表示。

在YCbCr空間中,Cb+Cr+Cg是一個常數。只有Y和Cb,Cr值被傳輸和存儲。而人類視覺系統對於亮度更加敏感,爲了減小圖像表示的數據量,因此Cb和Cr的分辨率能夠比Y低。由於人類的視覺系統相對於色度來講對亮度更加敏感,這就減小了表示圖像的數據量。,低分辨率色差並不會對圖像的質量產生影響,RGB和YCbCr表示的圖像看上去沒有什麼不一樣。所以對於色度採樣比亮度低的分辨率進行採樣是一種最簡單的壓縮方法。

圖像格式的幾種常見的轉換算法。。。

 

視頻壓縮(視頻編碼)是把數字視頻流用更少的數據位進行存放的方法。未經壓縮的視頻數據量很是大,因此壓縮對於數字視頻的存儲和傳輸來講都是必須的。圖像壓縮包括一對互補系統,一個編碼器(encoder)和一個解碼器(decoder)。編碼器利用圖像數據之間的相關性。在保證圖像質暈的狀況下使用較少的數據以傳播或存儲該圖像;而解碼器則把壓縮後的圖像還原出原始的視頻數據。

    圖像數據中的冗餘信息主要包括空間冗餘,時間冗餘,信息熵冗餘,結構冗餘,比例冗餘,視覺冗餘等。利用圖像數據不一樣類型的冗餘,科研工做者制定了不一樣的壓縮算法,有些複雜的壓縮算法則利用了幾種不一樣類型的冗餘。壓縮算法的分類較多,通常來講能夠分爲無失真壓縮和有失真壓縮兩大類。

無失真編碼,又叫做熵保存編碼,也稱爲熵編碼,這種編碼結果經解碼後可無失真的恢復出原圖像。通常來講壓縮率不是很高。無失真編碼的算法主要有:霍夫曼(Huffman)編碼,算術編碼,行程編碼(Run Length Code)。

考慮到人眼對失真不易察覺的生理特徵時,有些圖像編碼不嚴格要求熵保存,信息可容許部分損失以換取高的數據壓縮比,這種編碼是有失真數據壓縮,一般運動圖像的數據,一般運動圖像的數據壓縮都使用有失真編碼,香農(Shannon)率失真理論對此有比較深刻的解釋,在此就再也不贅述了。有失真編碼的算法主要有:預測編碼,變換編碼,運動補償和估計,小波變換(wave.1et)編碼,分形編碼等。

圖像數據的壓縮主要是對各類圖像數據冗餘度及視覺冗餘度的壓縮,包括以下一些方法:

1、統計冗餘度的壓縮:對於一串由許多數值構成的數據來講,若是其中某些值常常出現,而另一些值不多出現,則取值上的統計不均勻性就構成了統計冗餘度。利用該統計不均勻性可對視頻數據進行壓縮:常常出現的值用短碼表示,對不常常出現的值用長碼表示,於是.相對於定長表示法,用這種方法表示一串數據能夠節省碼位。這就是霍夫曼編碼的思想。霍夫曼編碼是無損壓縮,目前在圖像壓縮編碼中被普遍採用。

視頻圖像在每一點的取值上具備任意性。對於運動圖像而言,每一點在一段時間內能取任意值,在取值上具備統計均勻性,難以直接運用霍夫曼編碼的方法,但能夠經過適當的變換編碼的方法,如DCT變換,使原圖像變成由一串統計不均勻的數據所表示,而後利用霍夫曼編碼進行壓縮。

2、空間冗餘度的壓縮:一幅視頻圖像相鄰各點的取值每每相近或相同,具備空間相關性,這就是空間冗餘度。圖像的空間相關性說明相鄰象素點的值變化緩慢。從頻域的觀點看,這意味着圖像信號的能量主要集中在低頻附近,高頻信號的能量隨頻率的增長而迅速衰減。經過頻域變換,能夠將原圖像信號用直流份量及少數低頻交流份量表示,這就是變換編碼中的離散餘弦變換DCT的原理。DCT變換是MPEG-4壓縮編碼的基礎,它能夠對圖像的空間冗餘度進行有效的壓縮。

變換編碼不直接對空域圖像信號進行編碼,而是將空域圖像信號變換到另外一個正交矢量空間(變換域、頻域)進行處理,在空域上具備強相關性的信號在變換到頻域上以後相關性將大大下降,對頻域信號進行量化以後就能達到壓縮的目的。在視頻變換中,應用最普遍的是DCT。

視頻圖像中常常出現一連串連續的象素點具備相同值的狀況,典型的如彩條,彩場信號等。只傳送起始像素點的值及隨後取相同值的象素點的個數,也能有效地壓縮碼流,這就是遊程編碼(Run Length Coding)。因爲DCT變換後高頻部分0數據較爲集中,若是把數據按照由低頻劍高頻的方式鏈接起來,將使遊程編碼獲得更高的壓縮率,這就是zigzag掃描。目前在圖像壓縮編碼中,行遊程編碼並不直接對圖像數據進行編碼,主要用於對zigzag掃描後的DCT係數進行編碼。 (原始圖像->DCT變換->zigzag掃描DCT係數->遊程編碼)

3、時間冗餘度的壓縮:時間冗餘度表如今視頻畫面中相繼各幀對應像素點的值每每相近或相同,具備時間相關性。在知道了一個像素點的值後,利用此像素點的值以及其與後一像素點的差值就可求出後一像素點的值。所以,不傳送像素點自己的值而傳送其與前一幀對應像素點的差值,也能有效地壓縮碼率,這就是差分編碼。在實際的壓縮編碼中.差分編碼主要用於各圖像塊在DCT變換後的直流係數。相對於交流係數而言,DCT直流係數的值很大。並且相繼各幀對應子塊的DCT直流係數的值通常比較接近,在圖像未發生跳變的狀況下,其差值同直流係數自己的值相比是很小的。

由差分編碼進一步發展起來的是運動預測編碼,其過程爲:對於當前幀中的一塊圖像,在一個參考幀中搜索與本塊圖像數據最接近的塊,計算出兩個塊位置差值,即運動矢量,而後將這兩個塊的圖像數據差值與運動矢量傳送給接收端。接收端根據運動矢量及差值恢復出原圖像。因爲運動矢量及差值的數據量低於原圖像的數據量,於是運動預測編碼也能達到壓縮圖像數據的目的。

預測編碼方法分線性預測和非線性預測編碼方法,其中線性預測編碼方法也稱爲差值脈衝編碼調製法,簡稱DPCM(Differention Pulse Code Modulation),這是比較經常使用的一種編碼方法。對於壓縮率要求不高的系統應優先考慮預測編碼,由於它比較簡單,容易實現。另外還有運動補償預測,這是利用時間冗餘的預測編碼技術,對於幀間圖像經常使用這種預測編碼技術。

4、視覺冗餘度的壓縮:視覺冗餘度是相對於人眼的視覺特性而言的。人眼對於圖像的視覺特性包括:對亮度信號比對色度信號敏感,對低頻信號比對高頻信號敏感,對靜止圖像比對運動圖像敏感,以及對圖像水平線條和垂直線條比對斜線敏感等。所以,包含在色度信號,圖像高頻信號和運動圖像中的一些數據並不能對增長視覺清晰度做山貢獻,而被認爲是多餘的,這就是視覺冗餘度

壓縮視覺冗餘度的核心思想是去掉那些人眼看不到的或相對於人類視覺無關緊要的幽像數據。對視覺冗餘度的壓縮一般已反映在各類具體的壓縮編碼過程當中。如對於DCT係數的直流與低頻部分採起細量化,而對高頻部分採起粗量化,使得DCT變換能借此壓縮碼率。在幀間預測編碼中,大碼率壓縮的預測幀及雙向預測幀的採用,也是利用了人眼對運動圖像細節不敏感的特性。

圖像壓縮編碼的具體方法雖然還有多種,但大都是創建在上述基本思想之上的。相關國際組織制定的各類視頻編碼標準也主要由DCT變換,遊程編碼,幀間預測編碼及霍夫曼編碼等編碼方法構成。

小波變換(Wavelet Transform)簡稱WT,也稱爲子波變換,是一種具備很好局域化(在時域和頻域)的時一頻(在圖像處理中也稱爲空-頻)分析的綜合方法。針對不一樣類型的圖像特色中的不一樣區域採用不一樣的空-頻分辨率,有可能獲得比其餘變換方法更高的壓縮比。並且與其餘變換相比,基於DWT(離散小波變換)的多分辨率分析具備與人類視覺系統相匹配的特性。

小波變換編碼器能夠分別處理信號的高頻部分和低頻部分,這與目前應用較廣的DCT不一樣,DCT的方法是從數據流中去除了絕大多數的高頻信息。因爲高頻成分大可能是因爲邊緣引發的,而邊緣對於圖像的識別至關重要,所以小波變換的應用對於圖像邊緣的識別有很是重要的意義。另外,小波變換中的圖像是做爲一個總體被傳送的,而基於DCT的編碼方法是把圖像分紅像素塊來傳輸的,所以基於小波變換的編碼不會出現塊效應

基於DWT的編碼算法能夠得到比基於DCT編碼算法更高的編碼效率,可是小波變換的運算量很高,所以DCT編碼算法如今依然應用普遍,而小波算法則在對圖像要求較高的地方被應用。

視頻編解碼器模型

視頻編碼器將圖像或者視頻流編碼成某種格式的壓縮文件,解碼器對壓縮後的文件進行解碼產生與原始相同或者相近的視頻流,視頻編碼器以下圖所示。視頻編碼器主要分爲3個功能單元:時域模型、空域模型和熵解碼器。

時域模型的輸入是未壓縮的原始視頻流,一般原始視頻流的相鄰幀之間有較大類似性,根據這個特色,經過創建時域模型來創建預測幀從而下降時域冗餘。時域模型中,當前幀減去預測幀獲得殘差圖像,預測幀越準確,獲得的殘差圖像能量越小。殘差圖像通過編碼後傳輸到解碼器,解碼器經過與殘差圖像相加來恢復當前幀圖像以重建相應的預測幀。預測幀的重建能夠參考一幀或多幀、以後或以前的圖像(即參考幀),精度可經過參考幀和當前幀直接的運動補償來提升。

視頻編碼器框圖

空域模型的輸入是殘差圖像,它利用相鄰像素點之間的類似性,消除殘差圖像的頻域冗餘。MPEG-4和H.264標準中,編碼器對殘差圖像進行頻域變換,量化獲得相應的係數。變換系數通過量化後保留的殘差係數做爲空域模型最後的輸出。

 

MPEG-4視頻信號是由一系列單獨的幀組成的。每一幀能夠單獨地進行壓縮解壓縮,以下圖就是對圖像的編解碼過程。這種稱爲幀內編碼(Intra-frame Coding),每一幀在"內部"進行編碼,沒有參考其餘幀。

圖像編碼器

可是,消除視頻序列中的時間冗餘信息,能夠達到更好的壓縮效果。具體經過給圖像編解碼器增長一個"先後幀"來實現,主要有兩個功能:

l、預測:基於一個或多個先前傳輸的幀來創建對當前幀的預測;

二、補償:從當前幀中減去預測幀來產生一個殘差幀。

之後就用"圖像編解碼器"來處理殘差幀。其中關鍵是預測功能,若是預測準確,殘差幀將包括較少的數據,這樣就能夠用圖像編解碼器進行有效的壓縮。爲了解碼幀,解碼器必須"逆反"補償過程,把預測加到解碼的殘差幀中去重建,這個過程就是幀間預測(Inter-frame Coding),示意圖以下圖。

帶預測的視頻編解碼器

MPEG-4視頻編解碼器:

MPEG-4分層描述語法結構:

    MPEG-4引入了視頻對象VO(Video Object)的概念,支持基於內容的交互功能和分級擴展(空域分級、時域分級)。一個視頻對象能夠是視頻場景中的任意的一塊區域,它的存在時間能夠任意長。視頻對象平面VOP(Video Object Plane)是每一具體時刻的視頻對象。這樣就將圖像序列中的每一幀中的場景,當作是由不一樣視頻對象平面的VOP所組成的,同一對象連續的VOP稱爲VO。視頻對象能夠是視頻序列中的人或具體的景物,如電視新聞中的播音員,或者電視尉中的一部運動的汽車;也能夠是在計算機技術合成的二維或者三維圖形。

MPEG-4編碼、解碼過程是在VOP上進行的。所以輸入視頻序列經過分析可將其分割爲多個視頻對象,對同一VO編碼後造成V0P。下面2幅圖分別顯示了矩形圖像幀VOP和任意形狀的VOP。VOP的編碼採用了和之前的MPEG標準相似的編碼原理:DCT和運動估計等算法。因爲V0P可具備任意的形狀,因此要求編碼系統可處理形狀(shape)信息,這和只能處理矩形幀序列的傳統視頻編碼標準相比有不少不一樣之處。在MPEG-4中,矩形幀被認爲是V0P的一種特例,這時編碼系統不用處理形狀信息,退化成了相似的MPEG.2m.263的傳統視頻編碼。

矩形VOP和VO

任意形狀VOP和VO

下圖,MPEG-4的視頻碼流提供了對視頻場景的分層描述。層次結構中的每一層均可以經過被稱爲起始碼的特殊碼字,從視頻流中識別出來。用來描述場景的分層級爲:

MPEG-4碼流層次化結構圖

(1)視頻序列VS(video Session):完整的MPEG-4場景,能夠包括任何二維和三維天然或合成對象以及它們的加強層。

(2)視頻對象VO(Video 0bject):一個視頻對象對應着場景中的一個特定2D對象。在大多數簡單場景中視頻對象都是一個矩形幀,固然也能夠是任意形狀的對象或是場景中的背景。

(3)視頻對象層V0L(Video Object Layer):根據應用的具體要求,每個視頻對象均可以用分級或不分級的方式進行編碼,用視頻對象層來表徵。視頻層提供了對分級編碼的支持,一個視頻對象可利用空間或時間可伸縮性進行編碼,使分辨率從粗糙到精確。

(4) 視頻對象平面VOP(Video 0bject Plane):一個VOP是對一個視頻對象的時間採樣,包括視頻對象的運動參數、形狀信息和紋理數據。VOP能夠是相互獨立編碼,也能夠是經過運動補償依靠其它VOP編碼。對VOP編碼就是針對某一時刻該幀畫面VO的形狀、運動、紋理等信息進行編碼。

鑑於以上所述的這種編解碼的思想,下圖是符合MPEG-4標準的簡單檔次的編碼器的原理框圖。

MPEG-4編碼器原理框圖

MPEG-4視頻部分致力於經過基於工具箱的視頻信息編碼方法來知足各類視頻通訊的應用需求。MPEG-4沒有明肯定義編解碼器,着重定義了編碼視頻的碼流語法及對此碼流解碼的方法。兼容的MPEG-4編碼器包括功能模塊如上圖,除濾波器外,大部分基本功能(預測、變換、量化、熵編碼)和其餘視頻標準(MPEG-一、MPEG-二、H.26l、H.26三、H.264)同樣採用相同原理。

編碼部分…

MPEG-4視頻解碼技術:

MPEG-4壓縮視頻的碼流結構: 經過MPEG-4碼流的分析有助於更好的理解MPEG-4解碼流程,MPEG-4標準定義了一個標準MPEG-4碼流中的每一位的具體含義。MPEG-4碼流的組織形式是按分層的形式組織起來的。以下圖所示(其實對不少標準的碼流都是這樣的)。

碼流的分層組織

首先,碼流頭是一個在碼流中其它地方不會如現的一個比較長的特殊序列,又叫起始碼字;而後是具體的頭信息,它定義了整個碼流的一些特徵,這些特徵將會對如何對這個碼流進行解碼產生影響,例如,幀的長度和寬度,該碼流使用投術等。幀頭,首先是幀起始碼字;而後是具體的幀頭信息,它定義了當前幀的一些特徵,例如當前幀使用的量化值等,這些信息決定了該如何解碼當前幀。從宏塊頭開始就是具體的數據了,宏塊頭並無一個宏塊起始碼字,它緊跟在幀頭信息後面。

按照上文的分析,只要給出一個符合MPEG-4標準的碼流,就能按照標準定義的碼流形式對這個碼流解析並進行解碼。首先,搜索碼流起始碼字,因爲起始碼字惟一,只要碼流正確,確定能搜索到,找到起始碼字後,就能夠對碼流頭信息進行解析,並把對後面的解碼有影響的碼字保存下來;接着,尋找幀頭起始碼字,找到後,對幀頭信息進行解析,並存儲對解碼過程有影響的碼字;最後,從碼流中讀出宏塊數據,並進行解碼,恢復爲原來的圖像。

這個過程有助於理解視頻解碼器的解碼流程,此部分介紹碼流的定義爲解碼流程分析打下了基礎,從而更好的實現最終解碼器算法的優化與實現。

MPEG-4視頻解碼的基本流程:

VOP是MPEG-4的基本編碼單元,它包含視頻對象邊框的足寸。下圖能夠看出一個VOP的解碼過程,MPEG-4視頻解碼主要由三部分組成:形狀解碼、運動解碼和紋理解碼,重建的VOP是經過合併解碼的形狀、運動和紋理信息獲得的。

MPEG-4解碼流程

解碼器的實現

解碼器流程圖:在解碼器的初始化部分定義瞭解碼器所須要的各類數據結構,設置相應的各類默認參數。當初始化完成以後,根據視頻流的頭數據得出該編碼視頻流的幀大小,而後以幀爲單位循環處理。

解碼器流程圖

在循環過程當中,根據視頻流語法格式依次讀出對應的視頻幀的頭信息數據進行分析,得出與該幀的編碼相關的各個參數,爲解碼器的相關參數賦值。根據讀出的編碼類型判斷當前處理的視頻壓縮幀應該以何種方式進行解碼。若是當前壓縮幀爲I-VOP編碼,則對該幀進行相應的I-VOP解碼;不然,爲實現的簡便性考慮,咱們在編碼器的實現中僅處理I-VOP和P-VOP兩種狀況,因此若是不是I-VOP的編碼那麼當前幀就爲P-VOP的編碼方式,則咱們採起相應的P-VOP的解碼方式進行解碼。不管是I-VOP仍是P-VOP方式的編碼幀,只要進行解碼以後,都將解碼後恢復的視頻數據存入固定的緩衝區中,在每個循環過程的最後,須要將緩衝區中的數據寫入待生成的圖像數據文件中。一個編碼幀解碼結束以後,判斷壓縮視頻流中的數據是否結束,若是結束,則解碼過程結束,不然返回循環過程的開始繼續解碼下一壓縮視頻幀。

頭信息的解碼

解碼的過程與編碼過程成對應關係。首先看VO、VOL、VOP頭信息的編碼和解碼過程。編碼時,若編碼第一幀,則首先調用函數PutVoVolHeader對VO、VOP的頭信息進行編碼,在之後對每一幀編碼時,即編碼VOP時,首先調用函數BitstreamPutvopHeader對每一個VOP的頭信息進行編碼。與此相對應,在解碼時,首先調用函數getvolhdr解碼V0、VOL的頭信息,而後在解碼每一幀時,調用函數getvophdr獲取V0P的頭信息。在實現代碼中能夠看到這些頭信息的編碼和解碼具備嚴格的對應關係。

函數PutvovolHeader和函數getvolhdr對應,對以下信息進行編碼和解碼:

函數BitstreamPutVopHeader和函數getvophdr對應,對以下信息進行編碼

在這個過程當中解碼出來的編碼模式prediction_type(inter或intra)    決定後面的解碼模式(inter或intra);解碼出來的量化參數信息quantizer決定解碼器逆量化部分的量化參數。

VOP的解碼

完成前面的頭信息解碼以後,解碼器開始針對每一個V0P進行解碼,調用函數get-mp4picture來完成這個過程。該函數的實現過程爲:

(1)初始化宏塊的循環控制變量;

(2)循環調用宏塊解碼函數macroblock對VOP中的每個宏塊進行解碼;

(3)調用函數make_edge對上一步得到的解碼幀frame—ref(亦做爲參考幀)進行邊緣填充;

(4)調用函數PictureDisplay將frame_ref圖像轉換爲bmp圖像;

(5)將當前幀與參考幀交換。

宏塊的解碼

上面說明的是VOP解碼的總體過程,下面着重說明其中的關鍵函數macroblock的實現。VOP的編碼過程是基於宏塊的,因此VOP解碼過程一樣是基於宏塊的,所以此函數是解碼的核心函數,它一方面經過VLD(可變長解碼)、RLD(行程解碼)、IQ(逆量化)、IDCT(逆DCT變換)解碼出原始圖像值(I_VOP)或偏差值(P-VOP);一方面解碼出運動矢量Motion Vector,並進行MC(運動補償)。宏塊解碼的過程以下:

1)宏塊頭信息解碼

解碼出宏塊的頭信息,這些信息由編碼器調用函數Bits_CountMB_combined編碼,它們包括COD(1 bit):解碼爲變量not_coded,決定是否coded macroblock(該宏塊是否被編碼)。

MCBPC:編碼時調用函數PutMCBPC_Intra或PutMCBPC-Inter完成編碼(使用VLC),解碼時調用函數getMCBPC完成解碼,用以決定編碼的宏塊類型derived_mb_type(INTRA,INTRA_Q,INTER,INTER_Q,INTER4V)。

Ac_pred_flag(1 bit):當宏塊類型爲INTRA或INTRA_Q時解碼。

CBPY:編碼時調用函數PutCBPY完成編碼,解碼時調用函數getCBPY完成解碼,結果用以獲得cbp值。

Dquant(2 bits):若是宏塊類型爲INTER_Q或INTRA_Q,則要解碼dquant值,用以修正量化參數quantizer。

2)運動矢量解碼

接下來,若是宏塊類型爲INTER、INTE_Q或INTER4V時,對運動矢量進行解碼,調用函數setMV。該解碼部分對應的編碼部分,即運動矢量的編碼由編碼器調用函數Bits_countMB_Motion來完成。

函數setMV的調用形式爲setMv(int block_num),由參數blocke_num控制不一樣類型宏塊的運動矢量解碼方法。當宏塊類型爲INTER或INTER_Q時,將block_num設爲-1,調用形式爲setMV(-1);當宏塊類型爲INTER4V時,調用形式爲

for(j=O; j<4; j++) { setMV(j) };

setMv函數分別對X方向和Y方向運動矢量進行解碼,他們的解碼方法同樣,這裏只看x方向矢量的解碼。首先調用函數getMVdata,hor_mv_data=getMVdata(),使用VLD(可變長解碼)得到編碼的運動矢量,若是scale_fac=l,即度量因子爲l,或hor_my_data=0,則mvd_x=hor_mv_data,即獲得的就是motion vector difference;不然,先用FLD(固定長解碼)解碼出my residual,再進行逆Scale操做,獲得mvd_x。

按下來調用函數find_pmv,計算運動矢量的預測值:compute motion vector prediction.此過程對用於編碼函數find_pmvs。該函數的調用形式爲int find_pmv(int block,int comp)。由參數block決定對INTER類型的宏塊仍是對INTER4V類型的宏塊解碼。對應的代碼以下:

if(block_num=-1){//it is for INTER macroblock

pmv_x=find_pmv(0, 0);

pmv_y=find_pmv(O, 1);

}

else{//it is for INTER4V macroblock

pmv_x=find_pmv(block_num, 0);

pmv_y=find_pmv(block_num, 1);

最終解碼出的運動矢量由mvd_x部分和pmv_x部分相加獲得:

mv_x = pmv_x + mvd_x;

if(mv_x < low)

mv_x -= range;

if(mv_x > high)

mv_x -= range;

而後將結果保存起來,供後續的運動補償MC使用。

運動補償及塊解碼

若是宏塊類型爲INTER,INTER_Q或INTER4V,則先進行運動補償,而後解碼出偏差值,將補償值和偏差值相加獲得原始宏塊的解碼結果。若是宏塊類型是內部宏塊(INTRA, INTRA_Q),則直接進行宏塊的紋理解碼。

塊解碼函數blockInter和blockIntra是解碼的核心函數,它們執行編碼塊信息的VLD,IQ和IDCT。BlockInter函數的實現過程是:首先循環調用函數vld_inter_dct,VLD得出VLC編碼獲得的偏差值塊信息,直到解碼完整個塊,與此同時進行逆量化得出DCT變換編碼獲得的變換系數。而後調用函數IDCT,進行逆DCT變換。BlockIntra函數比B1ockInter更復雜一些,它首先FLD(固定長解碼)得出DC係數,而後重構DC係數,接着循環調用函數vld_inter_dct,VLD得出AC係數,而後重構AC係數,解碼得出DC和AC係數以後,再調用函數iquant對它們進行逆量化IQ,最後調用函數IDCT進行逆DCT變換。這部分的解碼與編碼器中函數CodeMB和函數MB_CodeCoeff相對應,它們在對每個宏塊的編碼過程當中被調用。

塊解碼完成以後,就調用函數addblockInter和函數addblockIntra,將解碼結果加入到解碼幀上。

未編碼宏塊的處理

若是宏塊沒有被編碼(not_coded=1),則將解碼的矢量設爲0,宏塊模式設爲NOT_CODED,並執行重構操做。

相關文章
相關標籤/搜索