H264 NAL簡介與I幀判斷

2021-08-01 18:32:52 字數 1900 閱讀 7036

1、nal全稱network abstract layer, 即網路抽象層。

如下圖:

2、如何判斷幀型別(是影象參考幀還是i、p幀等)?

h264幀由nalu頭和nalu主體組成。

nalu頭由乙個位元組組成,它的語法如下:

+---------------+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|f|nri|  type   |

+----------------------+

f: 1個位元.

forbidden_zero_bit. 在 h

264 規範中規定了這一位必須為 0.

nri: 2個位元.

nal_ref_idc. 取00~11,似乎指示這個nalu的重要性,如00的nalu,解碼器可以丟棄它而不影響影象的回放,0~3,取值越大,表示當前nal越重要,需要優先受到保護。如果當前nal是屬於參考幀的片,或是序列引數集,或是影象引數集這些重要的單位時,本句法元素必需大於0。

type: 5個位元.

nal_unit_type. 這個nalu單元的型別,1~12由h.264使用,24~31由h.264以外的應用使用,簡述如下:

0     沒有定義

1-23  nal單元  單個 nal 單元包

1     不分割槽,非idr影象的片

2     片分割槽a

3     片分割槽b

4     片分割槽c

5     idr影象中的片

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 沒有定義

我們還是接著看最上面圖的碼流對應的資料來層層分析,以00 00 00 01分割之後的下乙個位元組就是nalu型別,將其轉為二進位制資料後,解讀順序為從左往右算,如下:

(1)第1位禁止位,值為1表示語法出錯

(2)第2~3位為參考級別

(3)第4~8為是nal單元型別

例如上面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幀)

所以判斷是否為i幀的演算法為: (nalu型別  & 0001  1111) = 5   即   nalu型別  & 31 = 5

比如0x65 & 31 = 5

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