H264/H265 Nal Unit Header
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264/H265 Nal Unit Header相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章
python小工具------将H264/H265码流文件转为一帧一帧的JPEG文件