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 取值一段数据截图以及对应的解析

时间: 2024-07-29 20:15:54

H264/H265 Nal Unit Header的相关文章

【视频编解码&#183;学习笔记】5. NAL Unit 结构分析

在上一节中通过一个小程序,可以提取NAL Unit所包含的的字节数据.H.264码流中的每一个NAL Unit的作用并不是相同的,而是根据不同的类型起不同的作用.下面将对NAL Unit中的数据进行解析. 一.NAL Unit结构 一个NAL Unit都是由一个NAL Header和一个NAL Body组成.对于基本版本的H.264标准(不考虑SVC和MVC扩展),一个NAL Header的长度固定为1,即8bit.这8bit的含义分别为: forbidden_zero_bit:每一个NAL H

解析 H.264 NAL Unit 帧类型

解析 H.264 NAL Unit 帧类型的代码: 1 ////////////////////////////////////////////////////////////////////////// 2 // 功能: 从 Nal Unit 数据中获取帧类型 3 // 读取字节结构体 4 typedef struct bs_t_T 5 { 6 unsigned char *pucStart; // 缓冲区首地址 7 unsigned char *pucCurrent; // 缓冲区当前的读写

H.264 NAL unit start code and NAL types

H.264 NAL unit start code and NAL types 在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL).其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输.NAL占一个字节. NAL单元(NALU):NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷(RBSP)的字节流. 数据流是储存在介质上时: 每个NALU

FFMPEG H264/H265 编码延迟问题

最新使用FFmpeg进行H264的编码时,发现视频编码有延迟,不是实时编码,进过一番研究发现,只要在调用avcodec_open2函数 打开编码器时,设置AVDictionary参数即可,关键代码如下: avcodec_open2函数: int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); 解决方案: AVDictionary *param = NULL; //H264, 设

h264, h265 和 libvpx 比较(h264/avc, hevc 和vp9比较)

好多开发者或公司咨询我们关于H.264和H.265(hevc)?的码率,在此,我们转一篇关于x264,x265, libvpx 比较.? A Large-Scale Comparison of x264, x265, and libvpx?-?a Sneak?Peekby Jan De Cock, Aditya Mavlankar, Anush Moorthy, and Anne Aaron ?With 83+ million members watching billions of hours

如何支持RTSP播放H.265(HEVC)流

随着H.265的普及,越来越多的开发者希望大牛直播SDK能支持低延迟的RTSP H.265播放,并分享相关经验: 实现思路: 对rtsp来说,要播放h265只要正确解析sdp和rtp包即可. 下面对这些相关内容做一些介绍. 1. H265 Nal Unit Header 简单介绍: H264的Nal Unit头是一个字节,265变成两个字节: ?F: 1 bit. forbidden_zero_bit. 265要求是0,是1的话指示语法违规等. Type: 6 bits. Nal类型. vps是

H264 NAL RTP打包

1. 网络抽象层单元类型 (NALU) NALU是H264用于网络传输的单元类型,一个完整的NALU单元一般是以0x000001或者0x00000001开始,其后跟的则是NALU头和NALU的数据:我们在网络传输的时候,会去掉开始的0x000001或者0x00000001的标志:一般需要将这些标志替换为RTP payload的头部(1个字节): 其中NALU数据就是RBSP数据: NALU 头由一个字节组成, 它的语法如下: +---------------+ |0|1|2|3|4|5|6|7|

rtp的封包与拆包h264

请看文档rfc3984 1.看h264的帧 SPS序列参数帧 00 00 00 01 67 64 .... PPS图像参数帧 00 00 00 01 68 EE.... I帧 00 00 00 01 65 EE.... P帧 00 00 00 01 61 E0 ... 2. rtp头 RTP 头格式如下: RTP 头的结构: 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1

在iOS平台使用ffmpeg解码h264视频流

来源:http://www.aichengxu.com/view/37145 在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或URL传入即可打开.读取视频数据.解码器初始参数设置等,都可以通过调用API来完成. 但是对于h264流,没有任何封装格式,也就无法使用libavformat.所以许多工作需要自己手工完成. 这里的h264流指AnnexB,也