1、NAL全稱Network Abstract Layer, 即網絡抽象層。
在H.264/AVC視頻編碼標准中,整個系統框架被分為了兩個層面:視頻編碼層面(VCL)和網絡抽象層面(NAL)。其中,前者負責有效表示視頻數據的內容,而后者則負責格式化數據並提供頭信息,以保證數據適合各種信道和存儲介質上的傳輸。因此我們平時的每幀數據就是一個NAL單元(SPS與PPS除外)。在實際的H264數據幀中,往往幀前面帶有00 00 00 01 或 00 00 01分隔符,一般來說編碼器編出的首幀數據為PPS與SPS,接着為I幀……
如下圖:
2、如何判斷幀類型(是圖像參考幀還是I、P幀等)?
NALU類型是我們判斷幀類型的利器,從官方文檔中得出如下圖:
我們還是接着看最上面圖的碼流對應的數據來層層分析,以00 00 00 01分割之后的下一個字節就是NALU類型,將其轉為二進制數據后,解讀順序為從左往右算,如下:
(1)第1位禁止位,值為1表示語法出錯
(2)第2~3位為參考級別
(3)第4~8為是nal單元類型
H264 NALU: 00 00 00 01(4字節) | NALU type(1字節) | NALU_data (N字節) | 0x00 00 00 01 |
---|---|---|---|
起始碼(4字節) | 類型 | 數據 | 下一個NALU |
NALU_type 1字節,定義為:
1比特禁止位 | 2比特 重要性指示位 | 5比特 類型 |
---|---|---|
固定為0 | 11 |
一般在00000001后有67,68以及65
其中0x67的二進制碼為:
0110 0111
4-8為00111,轉為十進制7,參考第二幅圖:7對應序列參數集SPS
其中0x68的二進制碼為:
0110 1000
4-8為01000,轉為十進制8,參考第二幅圖:8對應圖像參數集PPS
其中0x65的二進制碼為:
0110 0101
4-8為00101,轉為十進制5,參考第二幅圖:5對應IDR圖像中的片(I幀)
常用Nalu_type: 0x67 (0 11 00111) SPS 非常重要 type = 7 0x68 (0 11 01000) PPS 非常重要 type = 8 0x65 (0 11 00101) IDR幀 關鍵幀 非常重要 type = 5 0x61 (0 11 00001) I幀 重要 type=1 非IDR的I幀 不大常見 0x41 (0 10 00001) P幀 重要 type = 1 0x01 (0 00 00001) B幀 不重要 type = 1 0x06 (0 00 00110) SEI 不重要 type = 6
所以判斷是否為I幀的算法為: (NALU類型 & 0001 1111) = 5 即 NALU類型 & 31 = 5
比如0x65 & 31 = 5
最簡單的辦法是找0x65或0x25(I frame啟始位),或者去找0x67或0x27(SPS)和0x68或0x28(PPS)后面的完整包。SPS和PPS后面必然跟着I frame。(68之后,出現 000001 開始就是關鍵幀數據 )
參考地址:
https://www.cnblogs.com/virusolf/p/5000107.html
https://www.cnblogs.com/EasyNVR/p/11971702.html
https://blog.csdn.net/huibailingyu/article/details/42879573