H264是一種視頻編碼格式,並且可以作爲網絡視頻編解碼格式,因爲它具備以下特點:
它的基本流採用分層結構->包括視頻編碼層(VCL)和網絡適配層(NAL)
視頻編碼層負責高效的視頻內容表示,而網絡適配層負責以網絡所要求的恰當的方式對數據進行打包和傳送。
引入NAL並使之與VCL分離帶來的好處包括兩方面:
其一、使信號處理和網絡傳輸分離,VCL 和NAL 可以在不同的處理平臺上實現;
其二、VCL 和NAL 分離設計,使得在不同的網絡環境內,網關不需要因爲網絡環境不同而對VCL比特流進行重構和重編碼
H264的基本流由一系列NALU (Network Abstraction Layer Unit )組成,不同的NALU數據量各不相同。H.264 草案指出當數據流是儲存在介質上時,在每個NALU 前添加起始碼:0x00 00 0001,用來指示一個 NALU的起始和終止位置。在這樣的機制下,解碼器在碼流中檢測起始碼,作爲一個NALU得起始標識,當檢測到下一個起始碼時,當前NALU結束。每個NALU單元由一個字節的 NALU頭(NALU Header)和若干個字節的載荷數據(RBSP)組成。
其中NALU 頭的格式:
==========================表一===========================
BIT 0 1 2 3 4 5 6 7
F| NAI | TYPE
=========================================================
F:forbidden_zero_bit.1 位,如果有語法衝突,則爲 1。當網絡識別此單元存在比特錯誤時,可將其設爲 1,以便接收方丟掉該單元。
NRI:nal_ref_idc.2 位,用來指示該NALU 的重要性等級。值越大,表示當前NALU越重要。具體大於0 時取何值,沒有具體規定。
Type:5 位,指出NALU 的類型。具體如下所示:
===========================表二=================================
NAL_UNIT_TYPE NALU內容
0 未指定
1 非IDR圖像的編碼slice
2 編碼slice數據劃分A
3 編碼slice數據劃分B
4 編碼slice數據劃分C
5 IDR圖像中的編碼slice
6 SEI(補充增強信息)
7 SPS(序列參數集)
8 PPS(圖像參數集)
9 接入單元定界符
10 序列結束
11 碼流結束
12 填充數據
13-23 保留
24 STAP-A
25 STAP-B
26 MTAP16
27 MTAP24
28 FU-A
29 FU-B
30-31 undefined
==================================================================
需要特別指出的是,NRI 值爲 7 和 8 的NALU 分別爲序列參數集(sps)和圖像參數集(pps)。
參數集是一組很少改變的,爲大量VCL NALU 提供解碼信息的數據。其中序列參數集作用於一系列連續的編碼圖像,
而圖像參數集作用於編碼視頻序列中一個或多個獨立的圖像。
如果解碼器沒能正確接收到這兩個參數集,那麼其他NALU 也是無法解碼的。
因此它們一般在發送其它 NALU 之前發送,並且使用不同的信道或者更加可靠的傳輸協議(如TCP)進行傳輸,也可以重複傳輸。