天天看點

H264編碼技術[3]

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

​​
H264編碼技術[3]
​​  
圖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編碼技術[3]
​​ 
H264編碼技術[3]

其中A是變換核矩陣

a=1/2

H264編碼技術[3]
H264編碼技術[3]
H264編碼技術[3]
H264編碼技術[3]
H264編碼技術[3]

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

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

正變換的公式為:

H264編碼技術[3]

反變換公式為:

H264編碼技術[3]

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

H264編碼技術[3]
圖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編碼技術[3]
H264編碼技術[3]
圖3.21  宏塊劃分方式

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

1/4像素精度運動估計

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

H264編碼技術[3]
圖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]
圖3.23  可變宏塊編碼順序

slice

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

H264編碼技術[3]
圖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宏塊(一種特殊的幀内編碼宏塊)

作者:​​柒月​​