●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型...