NAL单元

义项:H.264/HEVC 视频编码的基本语法结构
NAL单元

NAL单元是H.264/AVC与HEVC等视频编码标准中的基本语法结构单位,全称网络抽象层单元(Network Abstraction Layer Unit)。编码器把视频编码层的输出封装成一个个NAL单元,解码器则以NAL单元为输入进行解码[1]。这种设计使编码数据能够适配分组网络、字节流以及各类文件存储环境,是将视频编码标准与具体传输系统解耦的关键机制[2]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

NAL单元是H.264/AVC或HEVC编码器输出、以及对应解码器输入的基本单位[1]。按照标准中的表述,它是一个语法结构,其中包含后续数据类型的指示,以及以原始字节序列载荷(RBSP)形式承载的数据字节,必要时还夹杂防竞争字节[1]。

H.264/AVC和HEVC把码流在概念上分成2层:一层是视频编码层(VCL),负责有效表示视频内容;另一层是网络抽象层(NAL),负责把编码数据格式化,并以适合在各种通信信道或存储介质上传递的方式提供头信息[3]。所有数据都装在NAL单元里,每个NAL单元包含整数个字节[3]。

原理

一个NAL单元由头部和载荷2部分组成[1]。在H.264/AVC中,头部占1个字节,包含3个语法元素:1位的forbidden_zero_bit用于标识该单元是否损坏,标准规定取值为1即为语法违规;2位的nal_ref_idc表示该单元内容对重建参考图像是否必要,取值为0表示其内容不用于帧间预测的参考图像、可以丢弃而不危及参考图像完整性,大于0则表示解码该单元是维持参考图像完整性所必需的;5位的nal_unit_type用于指明载荷类型[2]。载荷紧跟在头字节之后[2]。

在HEVC中,所有已规定的NAL单元类型都使用2字节的NAL单元头,其中包含nuh_layer_id和nuh_temporal_id_plus1等字段,nuh_layer_id指明VCL NAL单元所属的层或非VCL NAL单元适用的层,后者减1后得到该单元的时间标识[4]。与之相比,H.264/AVC的NAL单元头只有1个字节[1]。

按照VCL与非VCL的划分,NAL单元可分为VCL NAL单元和非VCL NAL单元[1]。VCL NAL单元通常就是编码条带(slice)NAL单元,携带核心压缩数据[1]。非VCL NAL单元则承载参数集、补充增强信息等辅助数据,典型类型包括序列参数集、图像参数集、访问单元定界符、序列结束符、流结束符、填充数据以及补充增强信息(SEI)[5]。

载荷部分的数据先组织成RBSP。原始数据比特串(SODB)被装入RBSP时,会在末尾补上rbsp_trailing_bits,即一个等于1的停止位,必要时再加若干对齐零位,使数据按字节对齐[6]。为防止载荷中偶然出现与起始码相同的比特模式而被误判为单元边界,编码器执行面向字节的起始码防竞争算法:一旦发现字节对齐的'00000000 00000000 000000xx'模式,就插入一个等于0x03的emulation_prevention_three_byte,解码时再将其丢弃[7]。

在需要传递或存储为连续字节流的场合,标准以起始码方式划分NAL单元边界。每个NAL单元之前加上起始码前缀,取值为0x000001或0x00000001,前者在3字节形式下使用,后者为4字节形式[8]。当包含参数集或一幅图像的第一个条带时,起始码前缀为4字节的0x00000001,其余情形为3字节的0x000001[9]。字节流中的NAL单元顺序遵循解码顺序[10]。

发展历程

H.264/AVC由ITU-T视频编码专家组与ISO/IEC MPEG共同制定,2003年5月发布了ITU-T H.264建议书,其中附件B规定了字节流格式,用于在不提供帧结构的传输或存储环境中传递NAL单元[11][1]。该标准以网络抽象层与视频编码层分离的体系结构为特征,编码时不再沿用早期标准中依赖起始码的做法,改用NAL单元化的组织方式[12]。

IETF在2005年2月发布的RFC 3984中规定了H.264视频的RTP载荷格式,把NAL单元作为RTP载荷的封装对象,并说明NAL单元类型字节同时充当该载荷格式的有效载荷头[2]。这一格式引入了针对单个NAL单元、聚合与分片的多种打包方式,使NAL单元能够适配分组网络传输[12]。

其后制定的HEVC(即ITU-T H.265)沿用了NAL单元这一语法结构,并把单元头扩展为2字节,新增层标识与时间标识字段,以支持可伸缩与多层视频等场景。随着标准演进,NAL单元类型表中新增了视频参数集、自适应参数集等非VCL类型,参数集的层级组织由视频参数集、序列参数集到图像参数集逐层向下[13][3]。

应用

NAL单元是压缩视频数据在各类系统中流通的载体。视频电话、存储与流媒体等应用都通过NAL单元获得与网络环境相适应的视频表示[14]。在实时传输场景中,编码条带被封装进NAL单元后打包为RTP载荷发送[2]。

在文件存储中,符合ISO基础媒体文件格式的容器可把参数集放在样本条目里,而编码数据存放在文件的其他位置或另一文件中,实现参数集与码流的分离存放[13]。在字节流容器中,比如传输流场景,NAL单元之间以起始码前缀分隔,以便接收端重新同步[8]。

若干NAL单元还可组成访问单元,用于表示视频数据的一帧及相应数据,访问单元大致包含针对某一个输出时间点的所有NAL单元[15]。解码器从随机接入点开始解码时,能否正确恢复后续图像与这些单元的类型标识密切相关[16]。

局限

NAL单元本身并不携带自身的长度信息,单元的字节大小需要在单元之外说明,或者通过识别字节流中NAL单元之间的边界来测量[1]。在字节流格式下,解码器需要依靠起始码前缀来判断边界,一旦载荷中出现了未被防竞争机制处理的起始码模式,就可能产生虚假的单元边界[1]。

头部携带的错误与重要性信息是有限的。forbidden_zero_bit只能指示单元是否被标记为损坏,标准把取值1视为语法违规,但该位并不提供错误位置或纠错能力[2]。nal_ref_idc只给出相对重要性的粗略分级,H.264/AVC中该字段只有2位、取值为0至3,因此仅能作4个档次的处理[12]。

此外,补充增强信息这类NAL单元所承载的消息并非解码输出图像所必需,标准为这类消息规定了语法和语义,但未定义接收端处理它们的过程,因此符合标准的解码器不要求处理SEI消息来保证输出顺序符合性[13]。这意味着依赖SEI传递的信息在跨系统互通时可能得不到保证[13]。

参见

  • H.264/AVC —— 最早把网络抽象层与视频编码层分离、以NAL单元组织码流的视频编码标准。

  • HEVC —— 沿用NAL单元结构并把单元头扩展为2字节的后续视频编码标准。

  • 视频编码层 —— 与网络抽象层相对应的概念层,负责视频内容的编码表示。

  • 序列参数集 —— 承载编码视频序列全局参数的非VCL NAL单元类型。

  • 图像参数集 —— 承载若干编码图像共用参数的非VCL NAL单元类型。

  • RTP —— 规定H.264视频载荷格式、以NAL单元为封装对象的实时传输协议。

参考资料

  1. google.com 上的网页 [引用日期2026-10-14]
  2. RFC3984(PDF) [引用日期2026-10-14]
  3. [0027]图3展示包括多个CVS的比特流的示例,其中CVS由相应访问单元中所包括的NAL单元表示 [引用日期2026-10-14]
  4. US20250317589A1 [引用日期2026-10-14]
  5. H.264编码 [引用日期2026-10-14]
  6. download-documents [引用日期2026-10-14]
  7. US20220400256A1(PDF) [引用日期2026-10-14]
  8. swgde.org 上的 PDF 文件 [引用日期2026-10-14]
  9. core.ac.uk 上的 PDF 文件 [引用日期2026-10-14]
  10. gov.vn 上的 PDF 文件 [引用日期2026-10-14]
  11. ITU-T Content [引用日期2026-10-14]
  12. JP2010272943A(PDF) [引用日期2026-10-14]
  13. US20200260071A1(PDF) [引用日期2026-10-14]
  14. google.com 上的网页 [引用日期2026-10-14]
  15. CN102474655B(PDF) [引用日期2026-10-14]
  16. US11909983 [引用日期2026-10-14]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T18:40:33Z

历史版本

本条目引用的词条
H.264/AVC HEVC 视频编码层 序列参数集 图像参数集 RTP