H264編碼器5( x264原始碼簡單分析:x264_slice_write() 與H264 編碼簡介)
x264原始碼簡單分析:x264_slice_write()
來自:https://blog.csdn.net/leixiaohua1020/article/details/45536607
H264 編碼簡介
https://blog.csdn.net/mydear_11000/article/details/49990637
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提供瞭解決網路傳輸包丟失的問題的工具,適用於在高誤位元速率傳輸的無線網路中傳輸視訊資料。
8.較高的複雜度:264效能的改進是以增加複雜性為代價而獲得的。據估計,H.264編碼的計算複雜度大約相當於H.263的3倍,解碼複雜度大約相當於H.263的2倍。
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是變換核矩陣
a=1/2
(2)2×2色度塊的DC係數變換
每個巨集塊內的4個4×4色度塊經過變換後,每個塊的DC係數構成了一個2×2的塊WD,對其進行2×2的Hadamard變換。
正變換的公式為:
反變換公式為:
(3)如圖3.18所示,展示了巨集塊中的變換塊及其傳送順序。編號為-1的塊在採用Intra16x16模式編碼時0-15號4x4子塊經整數DCT變換後的DC係數在經4x4的哈達變換的結果。塊16、17是色度塊的DC係數進行2x2哈達碼變換的結果。其餘的24塊則進行4x4整數變換。
圖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 亞畫素取樣點 |
半畫素內插值分別由運動於水平和垂直方向的一維6階濾波器產生。1/4畫素值由整數畫素和半畫素點求均值取得。
例如:
b=round((E-5F+20G+20H-5I+J)/32) a=round((G+b)/2) e=round((b+h)/2) |
由於亮度分量中的1/4畫素精度運動向量將在色度分量中產生1/8畫素精度。因此,採用線性內插法產生1/8畫素取樣點。
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巨集塊(一種特殊的幀內編碼巨集塊) |
擴充套件 |