1. 程式人生 > >H264/H265 Nal Unit Header

H264/H265 Nal Unit Header

pan rbsp _id 一個 組成 網絡 標準 指向 ref

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

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

H264 NAL Header:

--------------------
|0|1|2|3|4|5|6|7|
--------------------
|F|N_R | Type |

forbidden_bit: 1 bit,

nal_reference_idc: 2bit,VCL可以表征參考幀屬性,參考幀非0,非參考幀0,Non-VCL 表征解碼時的可丟棄與否,如SPS PPS不可丟棄 為1,SEI可丟棄為0

nal_unit_type: 5bit 表征當前NAL的類型,定義在標準Table 7-1。

JM: parser code

nalu->forbidden_bit = (*(nalu->buf) >> 7) & 1;
nalu->nal_reference_idc = (NalRefIdc) ((*(nalu->buf) >> 5) & 3);
nalu->nal_unit_type = (NaluType) ((*(nalu->buf)) & 0x1f);

Ex:以下為一段數據截圖以及對應的解析

技術分享

技術分享

技術分享

H265 NAL Header:

---------------------------------------

|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
----------------------------------------
|F| Type | LayerId | Tid |

forbidden_bit: 1 bit,

nal_unit_type: 6 bit 表征當前NAL的類型,定義在標準Table 7-1。

nuhLayerId:6 bit 編碼層級信息

temporalId:時間分級信息

HM Parser code: 以Byte獲取的方式如右:假設pData指針指向Nal_header。

此處容易造成困惑的點是nuh_layer_id 的前一個Byte的一個bit與後一個Byte的5bit擺放和最終怎麽組成實際返回值,前一個Byte的最低1 bit與後一個Byte的高5 bit。

Bool forbidden_zero_bit = bs.read(1); // forbidden_zero_bit (pData[0]>>7) & 0x1
assert(forbidden_zero_bit == 0);
nalu.m_nalUnitType = (NalUnitType) bs.read(6); // nal_unit_type (pData[0]>>1) & 0x3F
nalu.m_nuhLayerId = bs.read(6); // nuh_layer_id (pData[0] & 0x1 << 5) + (pData[1]>>3) & 0x1F
nalu.m_temporalId = bs.read(3) - 1; // nuh_temporal_id_plus1 (pData[1] & 0x7) - 1

Ex:以下為一段數據截圖以及對應的解析

技術分享

技術分享

Ex:以下為temporalId 取值一段數據截圖以及對應的解析

技術分享

技術分享

技術分享

技術分享

H264/H265 Nal Unit Header