視頻編碼H264結構

轉載自http://www.lxweimin.com/p/9522c4a7818d

1、簡介

H.264/AVC項目的目的是為了創建一個比以前的視頻壓縮標準,在更低的比特率的情況下依然能夠提供良好視頻質量的標準(如,一半或者更少于MPEG-2,H.263,或者MPEG-4 Part2)。同時,還要不會太大的增加設計的復雜性。
優勢:
1)網絡親和性,即可適用于各種傳輸網絡;
2)高的視頻壓縮比,當初提出的指標是比 H.263,MPEG-4,約為它們的 2 倍,現在都已基本實現;

需要視頻壓縮的原因也很簡單,因為未經編碼的文件體積太大一般視頻為了不讓觀眾感覺到卡頓,一秒鐘至少需要24幀畫面(一般是30幀),假如該視頻是一個1280x720分辨率的視頻,那么不經過編碼一秒鐘的大小:84.375MB

(1280 * 720 * 32 * 24) / (1024 * 1024) = 675Mbps

(675Mbps *1s) / 8 = 84.375MB

以32位色彩位深為例,每一個像素的數據大小是32bit(紅綠藍三原色各占8bit,亮度占8bit),也就是4字節(Byte)

帶寬是以 bit 為單位,因此占用帶寬約675兆/秒,如果視頻不經過壓縮直接在網絡上傳輸,那只有千兆網才能看得起直播了!這肯定不行,所以我們要進行壓縮,而 H.264 不僅壓縮比比較高,對網絡的兼容性也非常好,所以大多數人做直播也就選擇了 H.264 作為編碼格式了。

2、編碼流程(不懂反正)

那么 H.264 其編解碼流程是怎么樣的呢?其實可以主要分為 5 部分: 幀間和幀內預測(Estimation)、變換(Transform)和反變換、量化(Quantization)和反量化、環路濾波(Loop Filter)、熵編碼(Entropy Coding)。

3、原理簡介

H.264原始碼流(又稱為裸流),是有一個接一個的NALU組成的,而它的功能分為兩層:視頻編碼層(VCL, Video Coding Layer)和網絡提取層(NAL, Network Abstraction Layer)。
VCL 數據即編碼處理的輸出,它表示被壓縮編碼后的視頻數據 序列。在 VCL 數據傳輸或存儲之前,這些編碼的 VCL 數據,先被映射或封裝進 NAL 單元(以下簡稱 NALU,Nal Unit) 中。每個 NALU 包括一個原始字節序列負荷(RBSP, Raw Byte Sequence Payload)、一組對應于視頻編碼的 NALU 頭部信息。RBSP 的基本結構是:在原始編碼數據的后面填加了結尾 比特。一個 bit“1”若干比特“0”,以便字節對齊。

NAL 單元序列

上圖中的 NALU頭 + RBSP 就相當與一個 NALU (Nal Unit), 每個單元都按獨立的 NALU 傳送。 其實說白了,H.264 中的結構全部都是以 NALU 為主的,理解了 NALU,就理解 H.264 的結構了。

3.1、NALU與一幀圖片

一幀圖片經過 H.264 編碼器之后,就被編碼為一個或多個片(slice),而裝載著這些片(slice)的載體,就是 NALU 了,我們可以來看看 NALU 跟片的關系(slice)。


一幀圖片編碼后
NALU結構

片(Slice)的概念不同與幀(frame),幀(frame)是用作描述一張圖片的,一幀(frame)對應一張圖片,而片(Slice),是 H.264 中提出的新概念,是通過編碼圖片后切分通過高效的方式整合出來的概念,一張圖片至少有一個或多個片(Slice)。

上圖中可以看出,片(Slice)都是又 NALU 裝載并進行網絡傳輸的,但是這并不代表 NALU 內就一定是切片,這是充分不必要條件,因為 NALU 還有可能裝載著其他用作描述視頻的信息。

3.2、切片

片的主要作用是用作宏塊(Macroblock)的載體(ps:下面會介紹到宏塊的概念)。片之所以被創造出來,主要目的是為限制誤碼的擴散和傳輸。
如何限制誤碼的擴散和傳輸?
每個片(Slice)都應該是互相獨立被傳輸的,某片的預測(片(Slice)內預測和片(Slice)間預測)不能以其它片中的宏塊(Macroblock)為參考圖像。

那么片(Slice)的具體結構,用一張圖來直觀說明:


slice結構圖

我們可以理解為一 張/幀 圖片可以包含一個或多個分片(Slice),而每一個分片(Slice)包含整數個宏塊(Macroblock),即每片(Slice)至少一個 宏塊(Macroblock),最多時每片包含整個圖像的宏塊。

上圖結構中,我們不難看出,每個分片也包含著頭和數據兩部分:
1、分片頭中包含著分片類型、分片中的宏塊類型、分片幀的數量、分片屬于那個圖像以及對應的幀的設置和參數等信息。
2、分片數據中則是宏塊,這里就是我們要找的存儲像素數據的地方。

3.3 、宏塊

宏塊是視頻信息的主要承載者,因為它包含著每一個像素的亮度和色度信息。視頻解碼最主要的工作則是提供高效的方式從碼流中獲得宏塊中的像素陣列。
組成部分:一個宏塊由一個16×16亮度像素和附加的一個8×8 Cb和一個 8×8 Cr 彩色像素塊組成。每個圖象中,若干宏塊被排列成片的形式。

看一下宏塊的結構圖:


宏塊結構圖

從上圖中,可以看到,宏塊中包含了宏塊類型、預測類型、Coded Block Pattern、Quantization Parameter、像素的亮度和色度數據集等等信息。

3.4、切片跟宏塊的關系

對于切片(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 宏塊則利用雙向的參考圖象(當前和 來的已編碼圖象幀)進行幀內預測;


SP片(切換P):用于不同編碼流之間的切換,包含 P 和/或 I 宏塊;


SI片:擴展檔次中必須具有的切換,它包 了一種特殊類型的編碼宏塊,叫做 SI 宏塊,SI 也是擴展檔次中的必備功能;

4、整體結構

H.264碼流分層結構圖

其實 H.264 的碼流結構并沒有大家想的那么復雜,編碼后視頻的每一組圖像(GOP,圖像組)都給予了傳輸中的序列(PPS)和本身這個幀的圖像參數(SPS),所以,我們的整體結構,應該如此:


GOP (圖像組)主要用作形容一個 i 幀 到下一個 i 幀之間的間隔了多少個幀,增大圖片組能有效的減少編碼后的視頻體積,但是也會降低視頻質量,至于怎么取舍,得看需求了。

5、總結

H.264 中,句法元素共被組織成 序列、圖像、片、宏塊、子宏塊五個層次。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容