H264 编码简介
-----------------------
??????H264是新一代的編碼標準,以高壓縮高質量和支持多種網絡的流媒體傳輸著稱,在編碼方面,我理解的他的理論依據是:參照一段時間內圖像的統計結果表明,在相鄰幾幅圖像畫面中,一般有差別的像素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內。所以對于一段變化不大圖像畫面,我們可以先編碼出一個完整的圖像幀A,隨后的B幀就不編碼全部圖像,只寫入與A幀的差別,這樣B幀的大小就只有完整幀的1/10或更小!B幀之后的C幀如果變化不大,我們可以繼續以參考B的方式編碼C幀,這樣循環下去。這段圖像我們稱為一個序列(序列就是有相同特點的一段數據),當某個圖像與之前的圖像變化很大,無法參考前面的幀來生成,那我們就結束上一個序列,開始下一段序列,也就是對這個圖像生成一個完整幀A1,隨后的圖像就參考A1生成,只寫入與A1的差別內容。
???????在H264協議里定義了三種幀,完整編碼的幀叫I幀,參考之前的I幀生成的只包含差異部分編碼的幀叫P幀,還有一種參考前后的幀編碼的幀叫B幀。
???????H264采用的核心算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法。
?
----------------------
序列的說明
----------------------
???????在H264中圖像以序列為單位進行組織,一個序列是一段圖像編碼后的數據流,以I幀開始,到下一個I幀結束。
???????一個序列的第一個圖像叫做 IDR圖像(立即刷新圖像),IDR 圖像都是 I 幀圖像。H.264引入 IDR 圖像是為了解碼的重同步,當解碼器解碼到 IDR圖像時,立即將參考幀隊列清空,將已解碼的數據全部輸出或拋棄,重新查找參數集,開始一個新的序列。這樣,如果前一個序列出現重大錯誤,在這里可以獲得重新同步的機會。IDR圖像之后的圖像永遠不會使用IDR之前的圖像的數據來解碼。
???????一個序列就是一段內容差異不太大的圖像編碼后生成的一串數據流。當運動變化比較少時,一個序列可以很長,因為運動變化少就代表圖像畫面的內容變動很小,所以就可以編一個I幀,然后一直P幀、B幀了。當運動變化多時,可能一個序列就比較短了,比如就包含一個I幀和3、4個P幀。
-----------------------
三種幀的說明
-----------------------
I幀:幀內編碼幀,I幀表示關鍵幀,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因為包含完整畫面)
I幀特點:
1.它是一個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸;
2.解碼時僅用I幀的數據就可重構完整圖像;
3.I幀描述了圖像背景和運動主體的詳情;
4.I幀不需要參考其他畫面而生成;
5.I幀是P幀和B幀的參考幀(其質量直接影響到同組中以后各幀的質量);
6.I幀是幀組GOP的基礎幀(第一幀),在一組中只有一個I幀;
7.I幀不需要考慮運動矢量;
8.I幀所占數據的信息量比較大。
P幀:前向預測編碼幀。P幀表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)
?
P幀的預測與重構:P幀是以I幀為參考幀,在I幀中找出P幀“某點”的預測值和運動矢量,取預測差值和運動矢量一起傳送。在接收端根據運動矢量從I幀中找出P幀“某點”的預測值并與差值相加以得到P幀“某點”樣值,從而可得到完整的P幀。
P幀特點:
1.P幀是I幀后面相隔1~2幀的編碼幀;
2.P幀采用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測誤差);
3.解碼時必須將I幀中的預測值與預測誤差求和后才能重構完整的P幀圖像;
4.P幀屬于前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀;
5.P幀可以是其后面P幀的參考幀,也可以是其前后的B幀的參考幀;
6.由于P幀是參考幀,它可能造成解碼錯誤的擴散;
7.由于是差值傳送,P幀的壓縮比較高。
B幀:雙向預測內插編碼幀。B幀是雙向差別幀,也就是B幀記錄的是本幀與前后幀的差別(具體比較復雜,有4種情況,但我這樣說簡單些),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之后的畫面,通過前后畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累。
?
B幀的預測與重構
B幀以前面的I或P幀和后面的P幀為參考幀,“找出”B幀“某點”的預測值和兩個運動矢量,并取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中“找出(算出)”預測值并與差值求和,得到B幀“某點”樣值,從而可得到完整的B幀。
B幀特點
1.B幀是由前面的I或P幀和后面的P幀來進行預測的;
2.B幀傳送的是它與前面的I或P幀和后面的P幀之間的預測誤差及運動矢量;
3.B幀是雙向預測編碼幀;
4.B幀壓縮比最高,因為它只反映丙參考幀間運動主體的變化情況,預測比較準確;
5.B幀不是參考幀,不會造成解碼錯誤的擴散。
注:I、B、P各幀是根據壓縮算法的需要,是人為定義的,它們都是實實在在的物理幀。一般來說,I幀的壓縮率是7(跟JPG差不多),P幀是20,B幀可以達到50。可見使用B幀能節省大量空間,節省出來的空間可以用來保存多一些I幀,這樣在相同碼率下,可以提供更好的畫質。
--------------------------------
壓縮算法的說明
--------------------------------
h264的壓縮方法:
1.分組:把幾幀圖像分為一組(GOP,也就是一個序列),為防止運動變化,幀數不宜取多。
2.定義幀:將每組內各幀圖像定義為三種類型,即I幀、B幀和P幀;
3.預測幀:以I幀做為基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀;
4.數據傳輸:最后將I幀數據與預測的差值信息進行存儲和傳輸。
?
???????幀內(Intraframe)壓縮也稱為空間壓縮(Spatialcompression)。當壓縮一幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗余信息,這實際上與靜態圖像壓縮類似。幀內一般采用有損壓縮算法,由于幀內壓縮是編碼一個完整的圖像,所以可以獨立的解碼、顯示。幀內壓縮一般達不到很高的壓縮,跟編碼jpeg差不多。
???????幀間(Interframe)壓縮的原理是:相鄰幾幀的數據有很大的相關性,或者說前后兩幀信息變化很小的特點。也即連續的視頻其相鄰幀之間具有冗余信息,根據這一特性,壓縮相鄰幀之間的冗余量就可以進一步提高壓縮量,減小壓縮比。幀間壓縮也稱為時間壓縮(Temporalcompression),它通過比較時間軸上不同幀之間的數據進行壓縮。幀間壓縮一般是無損的。幀差值(Framedifferencing)算法是一種典型的時間壓縮法,它通過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少數據量。
??????順便說下有損(Lossy )壓縮和無損(Lossyless)壓縮。無損壓縮也即壓縮前和解壓縮后的數據完全一致。多數的無損壓縮都采用RLE行程編碼算法。有損壓縮意味著解壓縮后的數據與壓縮前的數據不一致。在壓縮的過程中要丟失一些人眼和人耳所不敏感的圖像或音頻信息,而且丟失的信息不可恢復。幾乎所有高壓縮的算法都采用有損壓縮,這樣才能達到低數據率的目標。丟失的數據率與壓縮比有關,壓縮比越小,丟失的數據越多,解壓縮后的效果一般越差。此外,某些有損壓縮算法采用多次重復壓縮的方式,這樣還會引起額外的數據丟失。
H264層次構成
H264標準是由JVT(Joint Video Team,視頻聯合工作組)組織提出的新一代數字視頻編碼標準。JVT于2001年12月在泰國Pattaya成立。它由ITU-T的VCEG(視頻編碼專家組)和ISO/IEC的MPEG(活動圖像編碼專家組)兩個國際標準化組織的專家聯合組成。JVT的工作目標是制定一個新的視頻編碼標準,以實現視頻的高壓縮比、高圖像質量、良好的網絡適應性等目標H264標準。H264標準將作為MPEG-4標準的一個新的部分(MPEG-4 part.10)而獲得批準,是一個面向未來IP和無線環境下的新數字視頻壓縮編碼標準。
H264標準的主要特點如下:
1.更高的編碼效率:同H.263等標準的特率效率相比,能夠平均節省大于50%的碼率。
2.高質量的視頻畫面:H.264能夠在低碼率情況下提供高質量的視頻圖像,在較低帶寬上提供高質量的圖像傳輸是H.264的應用亮點。
3.提高網絡適應能力:H.264可以工作在實時通信應用(如視頻會議)低延時模式下,也可以工作在沒有延時的視頻存儲或視頻流服務器中。
4.采用混合編碼結構:同H.263相同,H.264也使用采用DCT變換編碼加DPCM的差分編碼的混合編碼結構,還增加了如多模式運動估計、幀內預測、多幀預測、基于內容的變長編碼、4x4二維整數變換等新的編碼方式,提高了編碼效率。
5.H.264的編碼選項較少:在H.263中編碼時往往需要設置相當多選項,增加了編碼的難度,而H.264做到了力求簡潔的“回歸基本”,降低了編碼時復雜度。
6.H.264可以應用在不同場合:H.264可以根據不同的環境使用不同的傳輸和播放速率,并且提供了豐富的錯誤處理工具,可以很好的控制或消除丟包和誤碼。
7.錯誤恢復功能:H.264提供了解決網絡傳輸包丟失的問題的工具,適用于在高誤碼率傳輸的無線網絡中傳輸視頻數據。
H264標準各主要部分有Access Unit delimiter(訪問單元分割符),SEI(附加增強信息),primary coded picture(基本圖像編碼),Redundant Coded Picture(冗余圖像編碼)。還有Instantaneous Decoding Refresh(IDR,即時解碼刷新)、Hypothetical Reference Decoder(HRD,假想碼流調度器)、Hypothetical Stream Scheduler(HSS,假想參考解碼)。
主要部分結構如圖3.18所示:
H.264的目標應用涵蓋了目前大部分的視頻服務,如有線電視遠程監控、交互媒體、數字電視、視頻會議、視頻點播、流媒體服務等。H.264為解決不同應用中的網絡傳輸的差異。定義了兩層:視頻編碼層(VCL:Video Coding Layer)負責高效的視頻內容表示,網絡提取層(NAL:Network Abstraction Layer)負責以網絡所要求的恰當的方式對數據進行打包和傳送。如圖3.19所示。
| ?? |
| 圖3.19? 標準的整體框架 |
基本層次(Baseline Profile):該層次使用了H.264的除了B-Slices,CABAC以及交織編碼模式外所有的特性。該層次主要使用于低時延的實時應用場合。
主要層次(Main Profile):包含Baseline profile的所有特性,并包括了B-slices,CABAC以及交織編碼模式。它主要針對對時延要求不高,當壓縮率和質量要求較高的場合。
擴展層次(Profile X):支持所有Baseline profile的特性,但不支持CABAC以及基于宏塊的自適應幀場編碼。該層次主要針對的時各種網絡視頻流傳輸方面的應用。
CABAC
CABAC是基于內容的自適應二進制算術編碼,當參數entropy_coding_mode設置為1時,一個算術系統被用來編碼和解碼H.264的語法元素。
H.264采用兩種方法進行熵編碼:CAVLC編碼和CABAC編碼算法。采用基于上下文的自適應二進制算術編碼算法(CABAC),能夠充分利用上下文信息和算術編碼的優點,使得編碼后的平均碼長更逼近圖像的信息熵,達到最佳的編碼效率。采用CABAC算法進行編碼,可以提高大約10%的編碼率
具體編碼步驟:
1二值化:CABAC使用二進制算術編碼,所以要將數據先轉換為二進制數據,這些原始數據包括變換系數和運動矢量等。轉換后二進制數據為可變長編碼的數據,并且還要將這些數據進行算術編碼。
2內容模式選擇:內容模式是針對二進制數據進行統計的概率模型,這個模式根據之前編碼的一些數據符號的統計特性從一些可選模式中選出。內容模式存儲了每一位“1”或“0”的概率。
3算術編碼:算術編碼器根據選擇的內容模式對每一位進行編碼。
4概率校正:被選擇的內容模式根據實際被編碼的值進行校正,例如,如果數據比特流中有數值“1”,就將“1”的概率統計值加1。
DCT變換
H.264仍然采用對殘差信號進行變換在量化后進行熵編碼的模式來壓縮空間冗余信息。使用了類似于4x4離散余弦變換DCT的整數變換而不是象MPEG4那樣采用8x8DCT的浮點數變換。最終使用那種變換方式還用根據殘余數據類型的不同來選擇,幀內編碼宏塊的亮度DC系數(僅對16x16預測模式有效)采用4x4的矩陣,色度DC系數采用2x2的矩陣,對于其他的都采用4X4的塊來變換。
使用以整數為基礎的空間變換可以提高計算速度(只使用加法和位移運算),但是使用整數變換要以不矢精確度為前提;整數變換的反變換過程中不會出現較大的誤差,并且縮放矩陣的乘法集成到了量化中,降低了乘法的總次數。
(1)4×4亮度分量的直流系數變換
如果宏塊被編碼為16×16幀內模式,則每個4×4殘差塊首先用前面敘述的變換進行變換,然后對于每個4×4的變換后的直流(DC)系數進行4×4的二次變換,采用Hadamard變換。
正變換為:
| ? |
| ? |
a=1/2
| ? |
| ? |
| ? |
| ? |
| ? |
(2)2×2色度塊的DC系數變換
每個宏塊內的4個4×4色度塊經過變換后,每個塊的DC系數構成了一個2×2的塊WD,對其進行2×2的Hadamard變換。
正變換的公式為:
| ? |
| ? |
| ? |
| 圖3.20? 宏塊中的變換及其傳送順序 |
多種運動補償塊
有7種形狀的運動補償可供選用,這7種塊是:INTER16x16,INTER16x8,INTER8x16,INTER8x8,INTER8x4,INTER4x8,INTER4x4。根據運動補償采用的塊尺寸的不同,宏塊的編碼模式分為四種,前三種模式分別按照一個16x16塊、兩個16x8塊和兩個8x16塊來進行運動補償;最后一種模式記作P8x8,在P8x8模式下,一個宏塊被分為4個8x8的子塊,而每一個子塊又有4種可能的子模式,分別按照一個8x8塊、兩個8x4塊、兩個4x8塊及四個4x4塊進行運動補償,如圖3.19所示,第一行是宏塊四種模式,第二行是子塊四種模式。
| ? |
| ? |
| 圖3.21? 宏塊劃分方式 |
塊大小的選擇是否合理對于壓縮效果的好壞有很大的影響,通常來說,對于變化緩慢的部分采用較大分塊效果比較好,對于包含較多細節的部分則應該采用較小的分塊方式。
1/4像素精度運動估計
幀內編碼宏塊的每一分塊都是由參考幀中相同大小的區域預測得到。這兩個區域之間的偏移量即運動矢量。由于圖像的運動不可能總是整像素的。因此引入了亞像素運動矢量。對亮度分量,運動矢量的分辨率為1/4像素。由于參考幀中本身不可能存在亞像素采樣點,因此需要利用其臨近像素內插產生亞像素采樣點。亞像素采樣點的內插產生過程,如圖3.20所示
| ? |
| 圖3.22? 亞像素采樣點 |
例如:
| b=round((E-5F+20G+20H-5I+J)/32) a=round((G+b)/2) e=round((b+h)/2) |
| a=round(([(8-dx).(8-dy)A+dx.(8-dy)B+(8-dx).dyC+dx.dyD]/64) |
圖片分割
H.264支持slice結構的圖片分割。一個slice有一幀圖片內的若干宏塊組成。編碼器端對slice種包含的宏塊數目沒有限制。一個slice可以僅包含一個宏塊也可以包含該幀中的所有宏塊。然而,任何一個宏塊都只能包含在某一個slice中,不允許重復出現(在冗余slice方法中例外)。
采用slice結構的主要動機是使編碼的slice大小能適應不同的MTU大小。當它同時能應用于交叉打包等方法的實現方案中。
多參考幀選擇
多參考幀選擇在之前的一些視頻編碼標準中也可以得到應用。該方法尤其使用于具有反饋機制的系統中。但在時延要求較高的應用中意義不大。
與以往標準的P幀、B幀不同,H.264采用了前向與后向多個參考幀的預測
數據分快
通常,宏塊中素有的碼元都是被編碼在單一的比特串中的。數據分塊則為每一個slice創建多個比特串。
在H.264中,使用了三種不同類型的數據分塊。
頭信息塊,包括宏塊類型,量化參數,運動矢量。這些信息是最重要的,因為離開他們,被的數據塊種的碼元都無法使用。該數據分塊稱為A類數據分塊。
幀內編碼信息數據塊,稱為B類數據分塊。它包含幀內編碼宏塊類型,幀內編碼系數。對應的slice來說,B類數據分塊的可用性依賴于A類數據分塊。和幀間編碼信息數據塊不通的是,幀內編碼信息能防止進一步的偏差,因此比幀間編碼信息更重要。
幀間編碼信息數據塊,稱為C類數據分塊。它包含幀間編碼宏塊類型,幀間編碼系數。它通常是slice種最大的一部分。幀間編碼信息數據塊是不重要的一部分。它所包含的信息并不提供編解碼器之間的同步。C類數據分塊的可用性也依賴于A類數據分塊,但于B類數據分塊無關。
當采用數據分塊方式的時候,源編碼器將不通類型的碼元放到三個不同的比特緩沖器種此外,slice大小也需要調整,以使最大數據分塊不會大于最大的MTU尺寸。以此,對數據分塊進行操作的是源編碼器而不是NAL。
在解碼器端,在開始正確解碼之前必須獲得所有數據分塊信息。然而,如果幀間或幀內編碼數據塊信息丟失了,頭信息仍然能夠有效地應用于提高差錯恢復效率。頭信息種包含宏塊類型,用動矢量等信息,因此能夠據此較高質量地復制信息。而僅僅丟失了一些圖像紋理信息。
參數集
序列參數集包括與一圖片序列相關地所有信息。圖像參數集包含與圖像中所有slice相關地信息。在解碼器端可以存儲多個不同地序列和圖片參數集。編碼器可以選擇適當地圖片參數集,圖片參數集本身又包含所引用地序列參數集信息。
參數集的創造性應用極大地提高了錯誤恢復性能。在容錯環境中使用參數集地關鍵是確保參數集能可靠并及時地到達接受端解碼器。一次可以用頻帶外可靠通訊控制協議傳送參數集,并確保在解碼器從實時通訊信道接收到第一個需要參考該參數集地slice數據之前送達。或者也可以在頻帶內傳輸,但必須采用一些應用層保護措施(例如傳送一參數集地多個復制,以提高至少一個復制到底目的地地概率)。第三中方案是在編碼器和解碼器端預先放置一些參數集,編解碼器都必須在其中選擇參數集。
可變宏塊排序
可變宏塊排序(FMO,Flexible Macroblock Ordering)可以在Baseline和Ext4ended模式中使用,但不允許在Main模式重使用。可變宏塊排序允許將宏塊不按照掃描順序分配給slice。具體地分配策略由一宏塊分配映射圖(MBAmap)規定。在slice內,宏塊仍然按照正常地掃描順序編碼。
該特性提供了一種將一幀圖像中的宏塊分配到多個slice中的模式,每個slice都是一個獨立的編碼單位,無論是幀間還是幀內編碼都不能越界,如果在傳輸過程中出現數據丟失的情況,可以利用已接收到的宏塊數據來對丟失的宏塊數據進行恢復。
| ? |
| 圖3.23? 可變宏塊編碼順序 |
slice
slice是一個類似于H.263中圖像組(GOP)的概念,一個slice是由一系列按光柵掃描順序排列的宏塊組成。一般情況下每個宏塊均包含一個16×16 的亮度陣列,當視頻格式不是單色時,還包含和兩個相應的色度陣列。如果沒有使用宏塊自適應幀/場解碼,每個宏塊代表圖像中的一個空間矩形區域。例如,如圖3.22所示,一幅圖像被分為兩個條帶。
| ? |
| 圖3.24? slice對象 |
每個slice都是一個獨立的編碼單位,無論是幀間還是幀內編碼都不能越界。冗余slice允許編碼器在同一數據流中嵌入同一slice中宏塊地一個或多個冗余表示。這種做法和傳輸層冗余技術,例如包復制等,關鍵區別是在冗余slice中宏塊地冗余表示可以使用不同地編碼參數編碼。例如,首先要表示可以使用相對較低的量化系數以獲得較低的圖像質量,而在冗余表示中可以用相對較高的量化系數以減少比特數。當解碼器正確接受到首要表示時,將冗余表示丟棄。而如果首要表示由于包丟失等原因無法正確獲得,能夠用冗余表示中地信息將相應slice數據恢復。冗余slice 最初是為支持高差錯無線通信環境而引入的,但在基于IP的環境中同樣有效。
通過塊匹配估計運動的方法
完全抵消所有運動的運動補償器將產生非常好的預測幀,以至于實際上在差別圖片中不會存在任何功率。我們需要相對較多的數據以詳細描述運動,但是只需要相對教少的數據,以描述差別幀。無可否認,甚至使用藝術技術也不可能從一般的幀源中識別和測量任何對象的運動。我們不得不滿足于簡化圖片模型,例如經常使用的塊匹配技術。除了次優的運動補償之外,差別圖片所需的數據速率比沒有運動補償所需的速率要小很多。進一步而言,我們的優勢是特別簡單,因而節省描述運動所需的位數。這在部分程度哂納感彌補了差別圖片的信號功率的不足,這種信號沒有完全最小化。
使用塊匹配技術的運動估計器
在數據壓縮中,塊匹配運動估計器可以任意處理每個新幀,使其用大小相同的直接相鄰的對象進行傳送。另外,對象僅僅能在2維平面上在一個方向上統一地移動。因而,被傳輸的幀被分割為一系列矩形圖案塊,它們是連續產生的。運動預測器假設圖案塊僅僅能在x和y方向上移動一個最大值。對于每個圖案塊,存在一個搜索區域,根據基本模型,在先前幀的這個區域內可以找到那個圖案塊。在使用等長步長的情況下,圖案塊逐漸移動通過搜索區域內的連續位置,并且每個位置都和舊圖片進行比較。
位置變換也稱為位移,如果某個位移達到了最佳的相似性或匹配結果,則它稱為搜索后運動。然后,運動補償幀的塊將填充屬于先前幀的塊的內容,這將和前面搜索的圖案塊產生最佳的匹配。通過這種方式,運動補償幀可以和瞬態幀盡可能地接近。
位移中的x和y成分通過側向通道而傳送到接受器,目的是可以從舊幀中構造運動補償幀。對先前幀的內容執行這個操作,從而對已知圖片進行這個操作,這就是這種編碼技術的本質優點。
向量的數據速率取決于查找區域的帶,從而取決于最大的位移,以及期望的向量的精確程度。對象的輪廓沒有必要傳送,原因是所有的對象具有相同的矩形。
P圖像的VLC編碼
VLC是可變長編碼,VLC是統計編碼技術,它的基本思想是:對出現頻率較高的數值分配比特數較少的碼字,而對出現頻率較低的數值分配比特數較多的碼字,因此從總的效果看,數據量比用均勻分配比特數的數據量要少。可變長編碼是對Huffman編碼的改進
P圖像是參考過去的幀內圖像或者過去預測得到得圖像用運動補償預測技術進行編碼,P圖像得編碼也是以圖像宏塊為基本編碼單元。預測編碼得 基礎是運動估值,它將直接影響到整個系統得編碼效率和壓縮性能,因此希望找到一種預測精度高同時計算量又小得運動估值算法。
正如I畫面一樣,每一幅P畫面被分為一片或多片,每一片又被劃分為若干宏塊。對P畫面的編碼要比I畫面復雜的多,因為要構造運動補償宏塊。運動補償宏塊與當前宏塊的差值被一個二維的DCT變換為8x8的變換系數矩陣,這些系數在被量化成一組量化系數,最后,對量化后的系數采用行程長度技術編碼。表3.11和3.12分別給出了P畫面和B畫面中所支持的宏塊類型及VLC編碼。
表3.11? P畫面中的宏塊類型及VLC編碼
宏塊類型 | VLC碼 | INTRA | MOTION FORWARD | CODED PATTERN | QUANT |
pred_mc | 1 | 0 | 1 | 1 | 0 |
pred_c | 01 | 0 | 0 | 1 | 0 |
pred_m | 001 | 0 | 1 | 0 | 0 |
intra_d | 0001 1 | 1 | 0 | 0 | 0 |
pred_mcq | 0001 0 | 0 | 1 | 1 | 1 |
pred_cq | 0000 1 | 0 | 0 | 1 | 1 |
intra_q | 0000 01 | 1 | 0 | 0 | 1 |
skipped | 無 | ? | ? | ? | ? |
表3.12? B畫面中的宏塊類型及VLC編碼
宏塊類型 | VLC碼 | INTRA | MOTION FORWARD | MOTION BACKWARD | CODED PATTERN | QUANT |
pred_I | 10 | 0 | 1 | 1 | 0 | 0 |
pred_ic | 11 | 0 | 1 | 1 | 1 | 0 |
pred_b | 010 | 0 | 0 | 1 | 0 | 0 |
pred_bc | 011 | 0 | 0 | 1 | 1 | 0 |
pred_f | 0010 | 0 | 1 | 0 | 0 | 0 |
pred_fc | 0011 | 0 | 1 | 0 | 1 | 0 |
intra_d | 0001 1 | 1 | 0 | 0 | 0 | 0 |
pred_icq | 0001 0 | 0 | 1 | 1 | 0 | 1 |
pred_fcq | 0000 11 | 0 | 1 | 0 | 0 | 1 |
pred_bcq | 0000 10 | 1 | 0 | 1 | 1 | 1 |
intra_q | 0000 01 | 1 | 0 | 0 | 0 | 1 |
skippde | 無 | ? | ? | ? | ? | ? |
每一幀B畫面被劃分成一片或多片,每一片又被劃分為若干宏塊。由于要構造幾種類型的運動補償宏塊:前向、后向、插播,所以對B畫面的編碼要比對P畫面復雜的多。首先用一個二維DCT將運動補償宏塊與當前塊之間的差值變換為8x8的變換系數矩陣,然后對著些系數進行量化,產生一組量化的系數,最后對這些量化后的系數用行程長度技術進行編碼。
編碼器不需要存儲解碼的B畫面,因為B畫面不用于運動補償。
B畫面宏塊比P畫面多了 幾種類型,如果僅有前向運動矢量,則像P畫面那樣,從前面的一幀畫面種構造運動補償宏塊。如果僅有后向運動矢量,則從后面的一幀畫面種構造運動補償宏塊。如果既有前向也有后向運動矢量,則從前面以及后面的畫面種構造運動補償宏塊,對結果求平均,用以形成插補宏塊。
如同需要存儲I畫面一樣,編碼器也需要存儲解了碼的P畫面,一位該P畫面很可能會作為運動補償的開始點。因此,編碼器將要從量化系數種重構該畫面的圖像。
H.264所支持的幀編碼模式如表3.13所示。
表3.13? 幀編碼模式
幀類型 | 描述 | 支持的框架 |
I(Intra) | 只包含幀內預測的宏塊(I) | 全部 |
P(Predicted) | 包含幀間預測宏塊(P)和I型宏塊 | 全部 |
B(Bi-Predictive) | 包含幀間雙向預測宏塊(B)和I型宏塊 | 擴展和主 |
SP(Switching P) | 利于在編碼的比特流中切換,包括I和P宏塊 | 擴展 |
SI(Switching I) | 利于在編碼的比特流中切換,包含SI宏塊(一種特殊的幀內編碼宏塊) | 擴展 |
總結
- 上一篇: 视音频编解码学习工程:JPEG分析器
- 下一篇: 两年前搭建的网狐系统