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的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu下播放h264,h265文件

ubuntu下播放h264,h265文件

python小工具------将H264/H265码流文件转为一帧一帧的JPEG文件

python小工具------将H264/H265码流文件转为一帧一帧的JPEG文件

流媒体开发—H.264/H.265裸流文件推流

Nodejs将h264/h265转码成mp4或某一帧图片