当前位置: 代码迷 >> 综合 >> H264/AVC NAL单元和解码
  详细解决方案

H264/AVC NAL单元和解码

热度:2   发布时间:2023-12-21 07:16:11.0

在264中,NAL是以NALU(NAL unit)为单元来支持编码数据在基于包交换技术网络中的传输的;它定义了符合传输层或存储介质需求的数据格式,同时提供头信息,从而提供了视频编码与外部世界的接口。网络层和传输层的RTP封装只针对基于NALU的本地NAL接口,且每个NALU都只包含整数个字节。


NALU结构

一个NALU定义了可用于基于包和基于比特流系统的基本格式,区别这两种格式的方法在于每个比特流传输层都有一个起始代码。在NAL解码器接口,它假定按传输顺序传递NALU,同时,在NALU的头部设置标识接收正确的、丢失的或错误的标识位,如果在有效载荷中包含位错误,则通过标识位来标志。

一个NALU结构上是一个包含一定语法元素的可变长字节字符串,例如NALU可以携带一个编码片,A、B、C 型数据分割或一个序列或图像参数集。每个NALU由一个字节的头和一个包含可变长编码符号的字符串组成。头部含三个定长比特区,如图8.3 所示:NALU类型(T),NAL-REFERENCE-IDC(R)和隐藏比特位(F)。NALU类型用5bit来代表NALU的32种中不同类型特征,类型1-12是H.264的定义的,类型24-31是用于H.264以外的,RTP负荷规范使这其中的一些值来定义包聚合和分裂,其他值为H.264保留。R比特用于在重构过程中标记一个NALU的重要性。用于参考的参数集和片,即用于预测未来的帧,被认为是重要的或高优先级的,因为它们的丢失会使解码后续编码的片变得困难。非引用片被认为对解码器很重要,因为它们的丢失不会影响任何进一步的解码。该信息可选择性地用于在传输期间对某些NALU进行优先级排序最后是隐藏比特位,在H.264编码中默认置为0,当网络识别到单元中存在比特错误时,可将其置为1。F位主要用于适应不同种类的网络环境(比如有线无线相结合的环境)。例如对于从无线到有线的网关,一边是无线的非IP协议环境,一边是有线网络的无比特错误的环境。假设一个NALU到达无线那边时,校验和检测失败,网关可以选择从NAL流中去掉这个NALU,也可以把已知被破坏的NALU传给接收端。在这种情况下,智能的解码器将尝试重构这个NALU(已知它可能包含比特错误)。而非智能的解码器将简单的抛弃这个NALU。

编码片被描述为视频编码层(VCL) NAL单元。编码序列从一个瞬时解码器刷新(IDR)访问单元开始,该单元由一个或多个IDR片组成,每个IDR片是一个Intra编码片。后面是默认的片类型,即非IDR编码的片,和/或data partitioned片。data partitioned(数据分割)片在独立的NAL单元中携带编码视频数据的不同组成部分,这在容易出错的传输情况下可能是有用的。非VCL NAL单元包括参数集、补充增强信息参数,这些参数可能对解码和显示视频数据有用,但对正确解码不是必需的。


NALU解码过程

NALU解码的总体流程就是,首先从NALU中提取出RBSP语法结构,然后按照下图进行处理。对于NALU的解码,输入是NALU,输出结果是经过解码的当前图像的样点值。

特殊的,对于7和8这两类。图像和序列参数集在其他数据NALU的解码过程中作为参数使用,在这些数据NALU的片头中通过语法元素pic_parameter_set_id设置它们使用的图像参数集编号,而相应的每个图象参数集中通过语法元素seq_parameter_set_id设置它所使用的序列参数集编号。