H264(NAL簡介與I幀判斷)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM