H264 結構 https://blog.csdn.net/andywang201001/article/details/80274886
H264 源碼 https://www.cnblogs.com/TaigaCon/p/5215448.html
一、視頻編碼標准化組織
H.264標准是屬於MPEG-4家族的一部分,即MPEG-4系列文檔ISO-14496的第10部分,因此又稱作MPEG-4/AVC。
二、視頻壓縮編碼的基本技術
預測編碼
幀間預測編碼,前后兩幀之間有數據冗余,差分之后數據量非常小,可以進行幀間預測編碼
幀內預測編碼,幀內有數據冗余,可以進行幀內預測編碼,幀內編碼后可以進行獨立解碼,不用參考其他幀
變換編碼:(變換到另一個數據域上)
編碼方式:DCT(離散余弦變換), DST(離散正弦變換),K-L變換
熵編碼:
由於一個數據塊的符號出現的概率並不一樣, 這就導致使用同樣長度的碼字表示所有的符號會造成浪費。通過熵編碼,針對不同的語法元素分配不同長度的碼元,可以有效消除視頻信息中由於符號概率導致的冗余。
三、VCL NAL
視頻編碼中采用的如預測編碼、變化量化、熵編碼等編碼工具主要工作在slice層或以下,這一層通常被稱為“視頻編碼層”(Video Coding Layer, VCL)。
相對的,在slice以上所進行的數據和算法通常稱之為“網絡抽象層”(Network Abstraction Layer, NAL)。設計定義NAL層的主要意義在於提升H.264格式的視頻對網絡傳輸和數據存儲的親和性。
四、檔次與級別
為了適應不同的應用場景,H.264也定義了三種不同的檔次:
- 基准檔次(Baseline Profile):主要用於視頻會議、可視電話等低延時實時通信領域;支持I條帶和P條帶,熵編碼支持CAVLC算法, 實時通信領域不使用B幀(雙向預測幀)
- 主要檔次(Main Profile):主要用於數字電視廣播、數字視頻數據存儲等;支持視頻場編碼、B條帶雙向預測和加權預測,熵編碼支持CAVLC和CABAC算法。
- 擴展檔次(Extended Profile):主要用於網絡視頻直播與點播等;支持基准檔次的所有特性,並支持SI和SP條帶,支持數據分割以改進誤碼性能,支持B條帶和加權預測,但不支持CABAC和場編碼。
CAVLC支援所有的H.264 profiles,CABAC則不支援Baseline以及Extended profiles。
名詞解釋:
VCL :Video Coding Layer 視頻編碼層
NAL: Network Abstraction Layer 網絡抽象層
RBSP : Raw Byte Sequence Payload,原始字節序列載荷
MB: 宏塊
GOP: 畫面組,
OP一般有兩個數字,如M=3,N=12.M制定I幀與P幀之間的距離,N指定兩個I幀之間的距離。那么現在的GOP結構是
I BBP BBP BBP BB I
NALU 分析
NALU = NAL Header | RBSP
RBSP = Slice Header | SliceData
SliceData = flags | MB MB MB...
幀 :有1個或多個片組,如果不采用FMO(靈活宏塊排序)機制,則一幀只有一個片組
片組 :包含1個片(slice)或多個片
片 :slice,由宏塊組成,如果不采用DP(數據分割)機制,1個片只包含1個NALU,
否則1個片由3個NALU組成,nal_unit_type值等於2、3、4的NALU屬於同一個片
分片的目的是限制誤碼的擴撒和傳輸,使片間保持獨立,[ [slice header] [slice data] ]
[slice header] 說明了片類型、屬於哪個幀、參考幀等
[slice data] 里是整數個宏塊
宏塊 :編碼處理的基本單元,由多個塊組成,通常宏塊大小為16X16像素,分為I、B、P宏塊
塊 :一個編碼圖像要划分成多個塊才能進行處理,一個塊是4X4像素
圖像解碼過程是按照slice進行解碼,然后按照片組將解碼宏塊重組成圖像