視頻編碼:H.264編碼

本文參考畢厚傑老師《新一代視頻壓縮編碼標準-----H.264/AVC》一書以及雷霄驊博客《視音頻編解碼技術零基礎學習方法》整理。

1.概念部分:

H.264編碼: 視頻編解碼技術有兩套標準,國際電聯(ITU-T)的標準H.261、H.263、H.263+等;還有ISO 的MPEG標準Mpeg1、Mpeg2、Mpeg4等等。H.264/AVC(又被稱爲MPEG-4 Part 10)是兩大組織集合H.263+和Mpeg4的優點聯合推出的最新標準,最具價值的部分無疑是更高的數據壓縮比。在同等的圖像質量條件下,H.264的數據壓縮比能比H.263高2倍,比MPEG-4高1.5倍。

相關名詞解釋:

逐行掃描:圖像可以看做是一個二維數組,逐行掃描是指在獲取圖像的時候從第0行開始,之後第1行…直至最後一行對圖像進行採樣。

隔行掃描:將一副圖像按照奇偶分成兩部分,0,2,4,6,8…,和1,3,5,7,9…。這樣分成兩部分獲取圖像數據,那麼一副圖像因此可以分成兩個部分,我們成爲場,偶數行所構成的場成爲頂場,奇數行構成的場成爲底場。

幀(frame):經過逐行掃描獲得的圖像數據稱爲幀。活動量較小或靜止的圖像採用幀編碼。

:經過隔行掃面獲得的圖像數據稱爲場。活動量較大的運動圖像一般採用場編碼。

H.264編碼器輸出的Bit流中,每個Bit都隸屬於某個句法元素。句法元素被組織成有層次的結構,分別描述各個層次的信息,句法元素共被組織成 序列、圖像、片、宏塊、子宏塊五個層次。

序列:序列會包含多個圖像

圖像:一幀或一場稱爲一幅圖像。

片(slice):一幅圖像內包含至少一個片。(有的博客稱其爲條帶)

I片:只包 I宏塊,I 宏塊利用從當前片中已解碼的像素作爲參考進行幀內預測(不能取其它片中的已解碼像素作爲參考進行幀內預測)。

P片:可包 P和I宏塊,P 宏塊利用前面已編碼圖象作爲參考圖象進行幀內預測,一個幀內編碼的宏塊可進一步作宏塊的分割:即 16×16、16×8、8×16 或 8×8 亮度像素塊(以及附帶的彩色像素);如果選了 8×8 的子宏塊,則可再分成各種子宏塊的分割,其尺寸爲 8×8、8×4、4×8 或 4×4 亮度像素塊(以及附帶的彩色像素)。

B片:可包 B和I宏塊,B 宏塊則利用雙向的參考圖象(當前和 來的已編碼圖象幀)進行幀內預測

宏塊:一個片包含若干個宏塊。視頻信息的主要承載者,因爲它包含着每一個像素的亮度和色度信息。視頻解碼最主要的工作則是提供高效的方式從碼流中獲得宏塊中的像素陣列。(宏塊也分爲I、P、B宏塊)

子宏塊:一個宏塊包含若干子宏塊。

運動估計:將活動圖像分成若干宏塊,並設法搜索出每個宏塊在鄰近幀圖像中的位置,並得到兩者之間空間位置的相對偏移量,得到的相對偏移量就是通常所指的運動矢量,得到運動矢量的過程被稱爲運動估計。(H.264涉及衆多算法,這裏的搜索算法不再深究)

2.結構:

H.264 原始碼流(又稱爲裸流),是有一個接一個的NALU組成的,而它的功能分爲兩層: 視頻編碼層(VCL, Video Coding Layer)和網絡提取層(NAL, Network Abstraction Layer)。VCL 數據即編碼處理的輸出,它表示被壓縮編碼後的視頻數據序列,網絡提取層(NAL, Network Abstraction Layer)將VCL封裝,成爲一個個NALU。

圖片編碼後
一幀圖片經過 H.264 編碼器之後,就被編碼爲一個或多個片(slice),而裝載着這些片(slice)的載體,就是 NALU。
NALU 結構
一個片的數據又被分成若干個宏塊。
片的結構

3.編碼流程:

H.264編解碼主要分爲五部分:幀間和幀內預測(Estimation)、變換(Transform)和反變換、量化(Quantization)和反量化、環路濾波(Loop Filter)、熵編碼(Entropy Coding)。

編碼流程

對比上圖,輸入的幀或場Fn以宏塊爲單位被編碼器處理,首先按照幀內或幀間預測編碼的方法進行處理。

預測編碼:視頻描述的是連續的圖像的集合。經過大量的統計表明,前後兩幅圖像中有大量的數據是一樣的,也就是存在着冗餘數據,那麼使用當前圖像對前一張圖像做“減法”,獲得兩個圖像的“差值”。那麼只需要“差值”即可從前一幅圖像中獲得當前的圖像信息。這個差值我們稱之爲殘差。並且這個差值可以看做是二維數組即看做是一個二維矩陣。使用一些數學上的方法對矩陣進行變換達到一定的壓縮目的,一般我們常用的數學方法是DCT,也叫作離散餘弦變換,變換的結果我們再次進行採樣,比如:DCT變換結果中的值範圍是從0,1000,那麼我們用0,10去表示這個範圍。這個過程叫做採樣。比如離散餘弦變換後的結果是{0,200,300,800,801,900,1000},我們對其進行重新採樣之後可以用以下序列替換{0,2,3,8,8,9,10}。這樣可以達到壓縮的目的。之後再對量化後的序列進行無損壓縮(熵編碼)。

預測編碼是對應的上圖中最上面一行的過程,當前幀Fn和前一幀F’n-1計算出殘差Dn,經過變換T,經過量化Q,重新排序,之後進行熵編碼得到了壓縮的圖像數據。

差分脈衝編碼DPCM:當前像素爲X,左臨近像素爲A,上臨近像素爲B,上左臨近像素爲C。與X之間距離越近的像素,相關性越強,越遠相關性越弱。以P作爲預測值,按照與X的距離不同給以不同的權值,吧這項像素的加權和作爲X的預測值,與實際值相減,得到差值q,由於臨近像素的相關性較強,q值非常小,達到壓縮編碼的目的。接收端把差值q與預測值相加,恢復原始值X。這個過程稱爲差分脈衝編碼DPCM。當前像素的實際值與預測值之間之間存在差值稱爲殘差,對殘差記性量化後,得到殘差量化值。解碼輸出與原始信號之間有因爲量化而產生的量化誤差。

運動估計:由於活動圖像臨近幀中存在一定的相關性,因此將圖像分成若干個宏塊,並搜索出各個宏塊在臨近圖像中的位置。並且得到宏塊的相對偏移量。得到的相對偏移量稱爲運動矢量。得到運動矢量的過程稱爲運動估計。在幀間預測編碼中,由於活動圖像臨近幀中景物存在一定的相關性,因此,可以將活動圖像分成若干塊或宏塊,並設法搜索出每個塊或宏塊在臨近幀圖像中的位置,並得出亮着之間的控件位置相對偏移量,得到的相對偏移量就是通常所指的運動矢量,得到運動矢量的過程被稱爲運動估計。運動矢量和經過匹配後得到的預測誤差共同發送到解碼端,在解碼端按照運動矢量指明的位置,從已經解碼的臨近參考幀圖像中找到相應的塊或宏塊,和預測誤差相加後就得到了塊或宏塊在當前幀中的位置。通過運動估計可以去除幀間的冗餘度,使得視頻傳輸的比特數大爲減少,因此運動估計是視頻壓縮處理的一個重要組成部分。

運動表示法:由於在成像的場景中一般有多個物體作不同的運動,如果直接按照不同類型的運動,將圖像分割成複雜區域是比較困難的,最直接和不受約束的方法是在每個像素都指定運動矢量,這就是基於像素表示法。對於任何類型圖像都適用,但是需要顧及大量的未知量,並且解在物理上多是不正確的,除非在顧及過程中事假適當的物理約束。在具體實現的時候是不可能的,通常採用基於塊的物體運動表示法。

塊匹配法:一般對於包含多個運動物體的景物,實際中普遍採用的方法是把一個圖像幀分成多個塊,使得在每個區域中的運動可以很好地用一個參數化模型表徵。即將圖像分成若干個nxn塊(如:16x16宏塊),爲每一個塊妱運動矢量,並進行運動補償預測編碼。

亞像素位置內插:幀間編碼宏塊中的每個塊或亞宏塊分割區域都是根據參考幀中的同尺寸的區域預測得到的,他們之間的關係用運動矢量來表示,由於自然物體的連續性,相鄰兩幀之間的塊運動矢量不是以整像素爲基本單位的,可能是以1/4或1/8像素等亞像素作爲單位的。

運動矢量中值預測:利用與當前塊E相鄰的左邊塊A,上邊塊B和右上方C的運動矢量,取其中值來作爲當前塊的運動矢量。運動矢量中值預測:利用與當前塊E相鄰的左邊塊A,上邊塊B和右上方C的運動矢量,取其中值來作爲當前塊的運動矢量。

空間域的上層塊模式運動矢量:H264提供的塊尺寸有16x16,8x16,16x8,8x8,8x4,4x8,4x4,他們的圖像分割區域分別定義爲搜索模式Model1-Model7.

前幀對應塊運動矢量預測:利用前一幀與當前塊相同座標位置的塊的運動矢量作爲當前塊的運動矢量

時間域的臨近參考幀運動矢量預測:由於視頻序列的連續性,當前塊再不同的參考幀中的運動矢量也有一定的相干性。假設當前所在幀的時間爲t,則當前在前面的參考幀t’中搜索.

當前塊的最優匹配塊時,可以利用當前塊再參考幀t’+1中的運動矢量來估計當前塊再幀t’的運動矢量。

變換編碼:絕大多數圖像都有一個共同的特徵,平坦區域和內容緩慢變化的區域佔據了一幅圖像的大部分,而細節區域和突變區域佔據較小部分。也就是說,圖像中的低頻直流佔大部分,高頻區域佔小部分。這樣空間域的圖像變換到頻域或所謂的變換域會產生相關性很小的變換系數,可以對其進行壓縮編碼。(關於時域頻域概念,本文中不加以詳細概述,請參考《傅立葉變換》和百度百科中《時域頻域》的相關解釋)

鏈接:https://www.jianshu.com/p/dd6694fe2d9a

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章