天天看點

H264編碼技術

H.264的目标應用涵蓋了眼下大部分的視訊服務,如有線電視遠端監控、互動媒體、數字電視、視訊會議、視訊點播、流媒體服務等。H.264為解決不同應用中的網絡傳輸的差異。定義了兩層:視訊編碼層(VCL:Video Coding Layer)負責高效的視訊内容表示,網絡提取層(NAL:Network Abstraction Layer)負責以網絡所要求的恰當的方式對資料進行打包和傳送。如圖3.19所看到的。

​​
H264編碼技術
​​  
圖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變換。

正變換為:

H264編碼技術
​​ 
H264編碼技術

當中A是變換核矩陣

a=1/2

H264編碼技術
H264編碼技術
H264編碼技術
H264編碼技術
H264編碼技術

(2)2×2色度塊的DC系數變換

每一個宏塊内的4個4×4色度塊經過變換後,每一個塊的DC系數構成了一個2×2的塊WD,對其進行2×2的Hadamard變換。

正變換的公式為:

H264編碼技術

反變換公式為:

H264編碼技術

(3)如圖3.18所看到的,展示了宏塊中的變換塊及其傳送順序。編号為-1的塊在採用Intra16x16模式編碼時0-15号4x4子塊經整數DCT變換後的DC系數在經4x4的哈達變換的結果。塊16、17是色度塊的DC系數進行2x2哈達碼變換的結果。其餘的24塊則進行4x4整數變換。

H264編碼技術
圖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所看到的,第一行是宏塊四種模式,第二行是子塊四種模式。

H264編碼技術
H264編碼技術
圖3.21  宏塊劃分方式

塊大小的選擇是否合理對于壓縮效果的好壞有非常大的影響,通常來說,對于變化緩慢的部分採用較大分塊效果比較好,對于包括較多細節的部分則應該採用較小的分塊方式。

1/4像素精度運動預計

幀内編碼宏塊的每一分塊都是由參考幀中同樣大小的區域預測得到。這兩個區域之間的偏移量即運動矢量。因為圖像的運動不可能總是整像素的。是以引入了亞像素運動矢量。對亮度分量,運動矢量的分辨率為1/4像素。因為參考幀中本身不可能存在亞像素採樣點,是以須要利用其臨近像素内插産生亞像素採樣點。亞像素採樣點的内插産生過程,如圖3.20所看到的

H264編碼技術
圖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都是一個獨立的編碼機關,不管是幀間還是幀内編碼都不能越界,假設在傳輸過程中出現資料丢失的情況,能夠利用已接收到的宏塊資料來對丢失的宏塊資料進行恢複。

H264編碼技術
圖3.23  可變宏塊編碼順序

slice

slice是一個類似于H.263中圖像組(GOP)的概念,一個slice是由一系列按光栅掃描順序排列的宏塊組成。普通情況下每一個宏塊均包括一個16×16 的亮度陣列,當視訊格式不是單色時,還包括和兩個對應的色度陣列。假設沒有使用宏塊自适應幀/場解碼,每一個宏塊代表圖像中的一個空間矩形區域。比如,如圖3.22所看到的,一幅圖像被分為兩個條帶。

H264編碼技術
圖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
pred_c
pred_m
intra_d 0001 1
pred_mcq 0001 0
pred_cq 0000 1
intra_q 0000 01
skipped

表3.12  B畫面中的宏塊類型及VLC編碼

MOTION BACKWARD
pred_I 10
pred_ic 11
pred_b
pred_bc
pred_f
pred_fc
pred_icq
pred_fcq 0000 11
pred_bcq 0000 10
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宏塊(一種特殊的幀内編碼宏塊)
下一篇: RTP封裝h264