轉帖 http://blog.csdn.net/jefry_xdz/article/details/8461343算法
一、NAL全稱Network Abstract Layer, 即網絡抽象層。
在H.264/AVC視頻編碼標準中,整個系統框架被分爲了兩個層面:視頻編碼層面(VCL)和網絡抽象層面(NAL)。其中,前者負責有效表示視頻數據的內容,然後者則負責格式化數據並提供頭信息,以保證數據適合各類信道和存儲介質上的傳輸。所以咱們平時的每幀數據就是一個NAL單元(SPS與PPS除外)。在實際的H264數據幀中,每每幀前面帶有00 00 00 01 或 00 00 01分隔符,通常來講編碼器編出的首幀數據爲PPS與SPS,接着爲I幀……網絡
以下圖:框架
二、如何判斷幀類型(是圖像參考幀仍是I、P幀等)?編碼
NALU類型是咱們判斷幀類型的利器,從官方文檔中得出以下圖:spa
咱們仍是接着看最上面圖的碼流對應的數據來層層分析,以00 00 00 01分割以後的下一個字節就是NALU類型,將其轉爲二進制數據後,解讀順序爲從左往右算,以下:
(1)第1位禁止位,值爲1表示語法出錯
(2)第2~3位爲參考級別
(3)第4~8爲是nal單元類型.net
例如上面00000001後有67,68以及65視頻
其中0x67的二進制碼爲:
0110 0111
4-8爲00111,轉爲十進制7,參考第二幅圖:7對應序列參數集SPSblog
其中0x68的二進制碼爲:
0110 1000
4-8爲01000,轉爲十進制8,參考第二幅圖:8對應圖像參數集PPS文檔
其中0x65的二進制碼爲:
0110 0101
4-8爲00101,轉爲十進制5,參考第二幅圖:5對應IDR圖像中的片(I幀)get
因此判斷是否爲I幀的算法爲: (NALU類型 & 0001 1111) = 5 即 NALU類型 & 31 = 5
好比0x65 & 31 = 5