1. 程式人生 > >H264 NAL解析

H264 NAL解析

earch 劃分 格式 -i ren 框架 ade 編碼 適合

NAL全稱Network Abstract Layer,即網絡抽象層。在H.264/AVC視頻編碼標準中,整個系統框架被分為了兩個層面:視頻編碼層面(VCL)和網絡抽象層面(NAL)。其中,前者負責有效表示視頻數據的內容,而後者則負責格式化數據並提供頭信息,以保證數據適合各種信道和存儲介質上的傳輸。NAL單元是NAL的基本語法結構,它包含一個字節的頭信息和一系列來自VCL的稱為原始字節序列載荷(RBSP)的字節流。

如果NALU對應的Slice為一幀的開始,則用4字節表示,即0x00000001;否則用3字節表示,0x000001。

NAL Header:forbidden_bit,nal_reference_bit(優先級)2bit,nal_unit_type(類型)5bit。

標識NAL單元中的RBSP數據類型,其中,nal_unit_type為1, 2, 3, 4, 5的NAL單元稱為VCL的NAL單元,其他類型的NAL單元為非VCL的NAL單元。

  • 0:未規定
  • 1:非IDR圖像中不采用數據劃分的片段
  • 2:非IDR圖像中A類數據劃分片段
  • 3:非IDR圖像中B類數據劃分片段
  • 4:非IDR圖像中C類數據劃分片段
  • 5:IDR圖像的片段
  • 6:補充增強信息(SEI)
  • 7:序列參數集(SPS)
  • 8:圖像參數集(PPS)
  • 9:分割符
  • 10:序列結束符
  • 11:流結束符
  • 12:填充數據
  • 13:序列參數集擴展
  • 14:帶前綴的NAL單元
  • 15:子序列參數集
  • 16 – 18:保留
  • 19:不采用數據劃分的輔助編碼圖像片段
  • 20:編碼片段擴展
  • 21 – 23:保留
  • 24 – 31:未規定

NAL的頭占用了一個字節,按照比特自高至低排列可以表示如下:

0AABBBBB

其中,AA用於表示該NAL是否可以丟棄(有無被其後的NAL參考),00b表示沒有參考作用,可丟棄,如B slice、SEI等,非零——包括01b、10b、11b——表示該NAL不可丟棄,如SPS、PPS、I Slice、P Slice等。常用的NAL頭的取值如:

0x67: SPS 
0x68: PPS 
0x65: IDR   
0x61: non-IDR Slice
0x01: B Slice
0x06: SEI
0x09: AU Delimiter

由於NAL的語法中沒有給出長度信息,實際的傳輸、存儲系統需要增加額外的頭實現各個NAL單元的定界。

其中,AVI文件和MPEG TS廣播流采取的是字節流的語法格式,即在NAL單元之前增加0x00000001的同步碼,則從AVI文件或MPEG TS PES包中讀出的一個H.264視頻幀以下面的形式存在:

00 00 00 01 06 ... 00 00 00 01 67 ... 00 00 00 01 68 ... 00 00 00 01 65 ...
SEI信息             SPS                PPS                IDR Slice

而對於MP4文件,NAL單元之前沒有同步碼,卻有若幹字節的長度碼,來表示NAL單元的長度,這個長度碼所占用的字節數由MP4文件頭給出;此外,從MP4讀出來的視頻幀不包含PPS和SPS,這些信息位於MP4的文件頭中,解析器必須在打開文件的時候就獲取它們。從MP4文件讀出的一個H.264幀往往是下面的形式(假設長度碼為2字節):

00 19 06 [... 25 字節...] 24 aa 65 [... 9386 字節...]
SEI信息                   IDR Slice

H264 NAL解析