H 264NAL單元語法

2021-08-20 21:21:27 字數 2918 閱讀 5284

●sps:序列引數集,作用於一系列連續的編碼影象;

●p幀:前向**編碼幀,p幀由在它前面的p幀或者i幀**而來

gop中的每一幀又可以分為若干slice,再以slice為單位進行編碼。每個slice是由若干巨集塊(macro block,mb)組成,其尺寸為16*16,是h.264編碼的基本單位。而mb是由4個8*8亮度塊和2個8*8色差塊組成。

h.264的5層碼流結構由上到下分別是gop,幀,slice,mb,b。結構如下(源於網路)

h.264單元具體結構如下:

其包括原始位元組序列載荷rbsp和乙個位元組的nal頭。

rbsp:

●sodb(string of data bits),資料位元串,它是最原始的編碼資料。

●rbsp(raw byte sequence payload), 原始位元組序列載荷,它是nal的基本傳輸單元,它是在 sodb 的後面新增了結尾位元「1」和若干位元0,以便位元組對齊。

nal header:

nalu頭部佔乙個位元組,由三部分組成forbidden_bit(禁止位,1bit),nal_reference_bit(重要性指示位 2bits)(優先順序),nal_unit_type(nalu型別,5bits)。

nalu頭的各個部分說明:

●f:  1  bit

forbidden_zero_bit. 在 h.264 規範中規定了這一位必須為 0.

●nri:  2 bit

nal_ref_idc. 取 00 ~ 11, 似乎指示這個 nalu 的重要性,如 00 的 nalu 解碼器可以丟棄它而不影響影象的回放. 不過一般情況下不太關心。 

●type:  5  bit

nal_unit_type. 這個 nalu 單元的型別. 簡述如下:

0     沒有定義

1-23 nal單元 單個 nal 單元包.

24    stap-a   單一時間的組合包

25    stap-b   單一時間的組合包

26    mtap16   多個時間的組合包

27    mtap24   多個時間的組合包

28    fu-a     分片的單元

29    fu-b     分片的單元

30-31 沒有定義

nalu型別:

對於乙個原始的 h.264 nalu 單元常由 [start code] [nalu header][nalu payload] 三部分組成,標識nal單元中的rbsp資料型別,nalu根據nal_unit_type的型別,可以分為:vcl的nal單元和非vcl的nal單元,其中,nal_unit_type為1, 2, 3, 4, 5及12的nal單元稱為vcl的nal單元,其他型別的nal單元為非vcl的nal單元。詳情如下:

nalu起始碼:

h.264在每個nalu前新增三個位元組的起始碼「0x 00 00 01」或四個位元組起始碼「0x 00 00 00 01」。

為了防止rbsp資料中出現「0x 00 00 01」 資料被誤解成起始碼,在編碼完成乙個nal時,編碼器按位元組搜尋nalu的rbsp資料中是否存在「00000000 00000000 000000**」,這裡**表示可能的2bite數:00、01、10、11。如果存在,則在兩個全0的位元組後面插入乙個0x03位元組的新增碼,即「00000000 00000000 00000011000000**」,解碼時發現「0x 00 00 03 0*」位元組,則扣除0x03後還原為原來的資料。

以一段實際的h.264碼流為例:

起始碼有兩種,圖中紅色矩形框部分,四個位元組的「00 00 00 01」和三個位元組的「00 00 01」都是。以起始碼分割之後的下乙個位元組就是nalu型別,將其轉為二進位制資料後,解讀順序為從左往右算,如下:

(1)第1位禁止位,值為1表示語法出錯

(2)第2~3位為參考級別

(3)第4~8為是nal單元型別

例如上面起始碼後有67,68,06, 65,41,01,

●其中0x67的二進位製碼為:0110 0111

●其中0x68的二進位製碼為:0110 0100

●同理,可得常用的nal頭對應的型別:

0x67: 序列引數集sps

0x68: 影象引數集pps

0x41: 不分割槽、非idr影象的片

0x65: idr  

0x61: non-idr slice

0x01: b slice

0x06:補充增強資訊單元sei

0x09: 分界符au delimiter

H264 NAL簡介與I幀判斷

1 nal全稱network abstract layer,即網路抽象層。如下圖 2 如何判斷幀型別 是影象參考幀還是i p幀等 nalu型別是我們判斷幀型別的利器,從官方文件中得出如下圖 我們還是接著看最上面圖的碼流對應的資料來層層分析,以00 00 00 01分割之後的下乙個位元組就是nalu型...

H264 NAL簡介與I幀判斷

1 nal全稱network abstract layer,即網路抽象層。如下圖 2 如何判斷幀型別 是影象參考幀還是i p幀等 nalu型別是我們判斷幀型別的利器,從官方文件中得出如下圖 我們還是接著看最上面圖的碼流對應的資料來層層分析,以00 00 00 01分割之後的下乙個位元組就是nalu型...

H264 NAL簡介與I幀判斷

1 nal全稱network abstract layer,即網路抽象層。如下圖 2 如何判斷幀型別 是影象參考幀還是i p幀等 nalu型別是我們判斷幀型別的利器,從官方文件中得出如下圖 我們還是接著看最上面圖的碼流對應的資料來層層分析,以00 00 00 01分割之後的下乙個位元組就是nalu型...