资溪县建设局网站,化学药品购买网站,做盘石信用认证网站,上海网站推广定制摘要#xff1a;本文详细描述了AVC的NALU的码流结构#xff0c;以及各个层面上NALU详细的构成。 关键字#xff1a;AVC#xff0c;NALU
1 NALU简介 NAL层即网络抽象层#xff08;Network Abstraction Layer#xff09;#xff0c;是为了方便在网络上传输的一种抽象… 摘要本文详细描述了AVC的NALU的码流结构以及各个层面上NALU详细的构成。 关键字AVCNALU
1 NALU简介 NAL层即网络抽象层Network Abstraction Layer是为了方便在网络上传输的一种抽象层。一般网络上传输的数据包有大小限制而AVC的帧大小远远大于网络传输的字节大小限制。因此要对AVC的数据流进行拆包将一帧数据拆分为多个包传输。和NAL层相对是VAL层即视频编码层Video Coding Layer NALU就是经过分组后的一个一个数据包。每个NALU由一个1字节的NALU头部和一个包含控制信息或编码视频数据的字节流组成。NALU头部包含了NALU的类型以及其重要性的信息。NALU的类型指示了NALU的用途或功能可以用于识别不同类型的单元例如参数集和用于参考的片段。用于参考的参数集和片段被认为是重要或高优先级的因为它们的丢失可能会导致难以解码后续的编码片段。非参考片段被认为对解码器的影响较小因为它们的丢失不会影响进一步的解码。这些信息可以选择性地用于在传输过程中对某些NALU进行优先级排序。 每个NALU中的VCL数据即编码序列以一个或多个即时解码器刷新IDR访问单元开始其中包含一个或多个IDR片段每个IDR片段都是一个帧内编码的片段。接下来是默认的片段类型即非IDR编码的片段以及/或者数据分割片段。数据分割片段将编码视频数据的不同组件分别放在单独的NAL单元中这在存在传输错误的情况下可能很有用。非VCL NAL单元包括参数集、补充增强信息参数这些参数对解码和显示视频数据可能有用但对于正确解码来说并非必需以及定义编码部分之间边界的分隔符。
2 NALU码流结构 一个完整的数据包包含多个NALU不同的NALU该如何组织规范中并没有规定因此实际实现比较广泛的有两种格式AnnexB和AVCC。
2.1 AnnexB AnnexB是一种比较常见的H264码流格式FFmpeg解封装的H264码流就是这种格式。AnnexB的格式比较简单每个NALU单元之前通过分隔符0x00 00 00 01或者0x00 00 01区分不同的NALU单元。对于非VCL和VCL的单元是不区分的都是存储在NALU的Body中。 由于NALU的Body中的数据是压缩数据可能出现start code因此规定RBSP中的0x000000、0x000001、0x000002和0x000003是非法的。如果数据中包含类似的二进制序列需要插入一个“模拟预防”字节0x03来实现使得0x000001变成0x00000301解码时去除即可。 VCL包含经过编码的数据而非VCL包含一些元数据协助解码。 2.2 AVCC 另一种常见的存储H.264流的方法是AVCC格式。在这种格式中每个NALU之前都有它的长度以大端格式表示。这种方法更容易解析但会失去附录B的字节对齐特性。长度可以使用1、2或4个不同的字节进行编码增加复杂性。该值存储在一个头部对象中通常被称为“extradata”或“sequence header”。它的基本格式如下
bits
8 version ( always 0x01 )
8 avc profile ( sps[0][1] )
8 avc compatibility ( sps[0][2] )
8 avc level ( sps[0][3] )
6 reserved ( all bits on )
2 NALULengthSizeMinusOne
3 reserved ( all bits on )
5 number of SPS NALUs (usually 1)repeated once per SPS:16 SPS sizevariable SPS NALU data8 number of PPS NALUs (usually 1)repeated once per PPS:16 PPS sizevariable PPS NALU data2.3 AVCC和AnnexB优点对比 两种不同格式的优点 附录BAnnex B格式
字节对齐特性Annex B格式使用起始码start code作为NALU的分隔符这使得解析和处理数据包相对容易因为起始码可以用于准确定位NALU的边界。广泛支持Annex B格式是H.264视频流的一种常见格式得到了广泛的支持并且在许多常见的容器格式如MP4中使用。适合网络流。 AVCC格式简化解析AVCC格式在每个NALU之前包含了长度信息这使得解析和处理数据包更加简单因为可以直接根据长度信息来定位和提取NALU。灵活性AVCC格式允许使用不同字节长度来编码NALU的长度从而提供了更大的灵活性可以适应不同大小的NALU。适合本地文件。
2.3 NALU 一个完整的NALU由NALU Header和RBSPRaw Byte Sequence Payloads组成。 NALU Header占位8Bit其中三个字段分别为
Forbidden_bit(1bit一定是0)NAL_Reference_bit2bit优先级如 00 的 NALU 解码器可以丢弃它而不影响图像的回放。03取值越大表示当前NALU越重要需要优先受到保护。如果当前NALU是属于参考帧的片或是序列参数集或是图像参数集这些重要的单位时本句法元素必需大于0NAL_UNIT_TYPE(5bit)标识了当前Unit的类型和优先级信息。 下面是Unit的类型标识和具体对应的类型描述一般码流的前两个NALU分别是SPS和PPS
0 Unspecified non-VCL
1 Coded slice of a non-IDR picture VCL
2 Coded slice data partition A VCL
3 Coded slice data partition B VCL
4 Coded slice data partition C VCL
5 Coded slice of an IDR picture VCL
6 Supplemental enhancement information (SEI) non-VCL
7 Sequence parameter set non-VCL
8 Picture parameter set non-VCL
9 Access unit delimiter non-VCL
10 End of sequence non-VCL
11 End of stream non-VCL
12 Filler data non-VCL
13 Sequence parameter set extension non-VCL
14 Prefix NAL unit non-VCL
15 Subset sequence parameter set non-VCL
16 Depth parameter set non-VCL
17..18 Reserved non-VCL
19 Coded slice of an auxiliary coded picture without partitioning non-VCL
20 Coded slice extension non-VCL
21 Coded slice extension for depth view components non-VCL
22..23 Reserved non-VCL
24..31 Unspecified non-VCLSPS 序列参数集包含解码配置比如profile level 分辨率和帧率等。PPS图像参数集包含有关熵编码模式、分片组、运动预测和去块滤波器等信息。IDR: 立即解码刷新单元这种NALU包含一个完整的图像序列不依赖其他NALU就可以独立解码和显示即一种特殊的I帧。 2.3.1 Slice 一个视频图像可编码成一个或更多个切片每个切片包含整数个宏块MB即每个切片至少一个 MB最多时每个切片包含整个图像的宏块。总之一幅图像中每个切片的宏块数不一定固定。设切片的目的是为了限制误码的扩散和传输应使编码切片相互间是独立的。某个切片的预测不能以其它切片中的宏块为参考图像这样某一切片中的预测误差才不会传播到其它切片中去。 切片由切片头和切片数据组成。切片头slice header传递了适用于切片中所有宏块macroblock的共同信息例如切片类型slice type切片类型确定了允许使用哪些宏块类型切片对应的帧编号参考图像设置以及默认量化参数QP。切片头包含了以下信息
切片类型切片类型确定了切片中可以使用的宏块类型例如I帧、P帧或B帧。帧编号切片头指示了切片所对应的帧的编号用于正确解码和顺序播放视频帧。参考图像设置切片头包含了参考图像的相关设置用于解码过程中的运动估计和补偿。默认量化参数QP切片头中包含了默认的量化参数用于控制视频质量和压缩率。 切片头中的这些信息对于解码器正确解码视频数据非常重要。通过切片头解码器可以了解切片中宏块的类型、参考图像的设置以及量化参数的默认值从而进行正确的解码和重建视频帧。切片头在H.264或AVC视频编码中起着关键的作用它提供了切片中宏块的共同信息确保视频数据能够被正确解码和播放。 切片数据部分由一系列组成切片的宏块macroblock组成。在许多编码序列中包含没有数据的宏块即跳过宏块skip macroblock是非常常见的情况。跳过宏块通过参数mb skip run来表示它表示一系列跳过的宏块的数量在CAVLC熵编码模式下使用或者通过mb skip flag来表示它表示单个跳过的宏块在CABAC熵编码模式下使用。跳过宏块是指在编码过程中某些宏块不包含有效的数据可以被跳过以提高编码效率。在切片数据部分中这些跳过宏块的存在是很常见的。在CAVLC熵编码模式下通过mb skip run参数来表示一连串跳过的宏块的数量。而在CABAC熵编码模式下通过mb skip flag参数来表示单个跳过的宏块。这些跳过宏块的存在可以减少编码数据量提高压缩效率。在解码过程中解码器会根据相应的参数来识别和处理跳过宏块以正确恢复视频帧的内容。切片数据部分中的这些跳过宏块对于视频编码和解码过程至关重要它们在提高编码效率和压缩率方面发挥着重要作用。
2.3.2 宏块 宏块层包含了解码单个宏块所需的所有语法元素。在H.264或AVC中宏块是视频编码的基本单元表示视频帧内的一个矩形像素块。宏块层包含了解码和重建宏块所需的所有信息和语法元素。宏块层中的语法元素包括
宏块类型指定宏块的类型如帧内I帧、预测P帧或双向预测B帧表示用于编码宏块的预测模式。运动矢量指定宏块相对于前一帧中参考位置的位移描述宏块的运动信息。变换系数表示经过离散余弦变换DCT和量化后的宏块变换系数。预测模式指示用于编码宏块的预测模式如帧内预测或帧间预测。残差数据包含预测和量化后的残差信息用于在解码过程中重建宏块。 通过解码宏块层中的语法元素解码器可以重建宏块并为整个视频帧的重建做出贡献。宏块层在解码过程中起着关键作用因为它包含了解码和重建单个宏块所需的所有必要信息。
3 参考文献
H.264媒体流AnnexB和AVCC格式分析 及 FFmpeg解析mp4的H.264码流方法Possible Locations for Sequence/Picture Parameter Set(s) for H.264 Streamwhat the advantage of h264 Annex-B VS AVCCH264解析H264: From NAL to RTP