音视频学习(六十三):AVCC和HVCC
AVCC
AVCC 专为 H.264 (AVC) 视频编码标准而生。在 H.264 的编码流中,存在两种关键的参数集:SPS(Sequence Parameter Set)和 PPS(Picture Parameter Set)。
- SPS (Sequence Parameter Set):这是一个全局性的参数集,定义了整个视频序列的通用配置。它包含了诸如视频的宽度、高度、帧率、编码器的 Profile 和 Level 等重要信息。你可以将其看作是为整个视频“定调”的关键参数。
- PPS (Picture Parameter Set):这是一个更局部的参数集,定义了单个或多个视频图像帧的配置。它包含了像参考帧数量、量化参数等信息,这些参数在编码过程中可能会有变化。
作用与原理
如果没有 AVCC,编码器每次在传输一个视频帧之前,都需要重复发送 SPS 和 PPS 信息。这会造成巨大的数据冗余,特别是在网络传输中,会严重降低效率。
为了解决这个问题,AVCC 应运而生。它将 SPS 和 PPS 信息打包成一个独立的配置记录,通常被放在视频文件的头部(例如 MP4 文件中的 avcC
box)或流的开头。解码器只需要在开始处理视频流时读取一次 AVCC,就能获取所有必要的配置参数,并用这些参数来解码后续的整个视频序列,大大提高了效率。
具体结构
+----------------------------+
| configurationVersion (1B) | 固定为 1
+----------------------------+
| AVCProfileIndication (1B) | SPS 里 profile_idc
+----------------------------+
| profile_compatibility (1B)| SPS 里 profile_compatibility
+----------------------------+
| AVCLevelIndication (1B) | SPS 里 level_idc
+----------------------------+
| reserved (6 bits, 111111) |
| lengthSizeMinusOne (2 bits)| NALU 长度字节数 - 1
+----------------------------+
| reserved (3 bits, 111) |
| numOfSequenceParameterSets(5 bits) | SPS 数量
+----------------------------+
| sequenceParameterSetLength(2B) | SPS 长度
+----------------------------+
| sequenceParameterSetNALUnit(...) | SPS 数据
+----------------------------+
| ... (如果有多个 SPS) |
+----------------------------+
| numOfPictureParameterSets (1B) | PPS 数量
+----------------------------+
| pictureParameterSetLength(2B) | PPS 长度
+----------------------------+
| pictureParameterSetNALUnit(...) | PPS 数据
+----------------------------+
| ... (如果有多个 PPS) |
+----------------------------+
| (可选扩展字段:High Profile 才有)|
| chroma_format, bit_depth_luma, |
| bit_depth_chroma, scaling list… |
+----------------------------+
AVCC 的结构通常包含以下几个核心字段:
- Version:版本号,表示 AVCC 的版本。
- Profile、Level、Profile Compatibility:这些字段与 SPS 中的信息对应,指示了视频的编码规格。
- NALU Length Size:一个非常关键的字段,它定义了后续每个 NALU(网络抽象层单元,H.264 的基本数据单元)长度的字节数。这使得解码器能够准确地知道每个数据单元的边界。
- SPS Count & SPS Data:SPS 的数量和实际的 SPS 数据。
- PPS Count & PPS Data:PPS 的数量和实际的 PPS 数据。
通过这种结构化的方式,AVCC 确保了解码器能够以最高效的方式获取并应用 H.264 的配置参数。
HVCC
HVCC 是 H.265 (HEVC) 视频编码标准的配置记录,其设计理念与 AVCC 完全相同,但由于 H.265 在编码效率上的巨大提升,其配置信息也变得更加复杂。
与 H.264 相比,H.265 引入了一个新的参数集:VPS(Video Parameter Set)。
- VPS (Video Parameter Set):视频参数集。这是 HEVC 新增的参数集,用于定义视频序列的通用参数,支持多层编码(layering)等新特性。VPS 使得 HEVC 能够更好地处理不同分辨率、帧率的视频流,尤其是在自适应流媒体(如 HLS, DASH)中。
- SPS (Sequence Parameter Set):序列参数集。在 HEVC 中,SPS 仍然存在,但其内容针对新的编码特性进行了扩展,例如支持更多的编码工具和语法元素。
- PPS (Picture Parameter Set):图像参数集。同样,PPS 也针对 HEVC 的新特性进行了更新和扩展。
作用与原理
与 AVCC 类似,HVCC 的核心作用是将 VPS、SPS 和 PPS 这些重要的配置信息集中打包,避免了在每个视频帧中重复传输。这对于参数集更加庞大和复杂的 HEVC 来说尤为重要。
HVCC 通常位于视频文件的头部,例如 MP4 文件中的 hvcC
box。解码器只需要读取这个 box,就能获得整个视频流的配置信息,然后开始高效地解码。
具体结构
+--------------------------------------------------+
| configurationVersion (1B) | 固定为 1
+--------------------------------------------------+
| general_profile_space (2b) | Profile 命名空间(0: 普通,1: "A",2: "B"...)
| general_tier_flag (1b) | 级别标志(0: Main Tier,1: High Tier)
| general_profile_idc (5b) | profile_idc(如 Main=1,Main10=2)
+--------------------------------------------------+
| general_profile_compatibility_flags (4B) | profile 兼容性位掩码
+--------------------------------------------------+
| general_constraint_indicator_flags (6B) | 约束标志(MaxLumaPS、MaxBitrate 等限制)
+--------------------------------------------------+
| general_level_idc (1B) | Level(如 120 表示 Level 4.0)
+--------------------------------------------------+
| reserved (4b, 1111) | 保留位
| min_spatial_segmentation_idc (12b) | 最小分段 ID(用于 Tiles/Slices,0xFFF=无约束)
+--------------------------------------------------+
| reserved (6b, 111111) | 保留位
| parallelismType (2b) | 并行解码支持(0: 未知,1: 支持 Wavefront)
+--------------------------------------------------+
| reserved (6b, 111111) | 保留位
| chromaFormat (2b) | 色度采样格式(1=4:2:0,2=4:2:2,3=4:4:4)
+--------------------------------------------------+
| reserved (5b, 11111) | 保留位
| bitDepthLumaMinus8 (3b) | Luma 位深度(如值为 2 → 实际位深 10bit)
+--------------------------------------------------+
| reserved (5b, 11111) | 保留位
| bitDepthChromaMinus8 (3b) | Chroma 位深度(同上)
+--------------------------------------------------+
| avgFrameRate (2B) | 平均帧率(0=未知,否则 *256 表示实际帧率)
+--------------------------------------------------+
| constantFrameRate (2b) | 0=未知,1=固定,2=可变,3=保留
| numTemporalLayers (3b) | 最大时间层数(1~7)
| temporalIdNested (1b) | 时间层嵌套标志(0=否,1=是)
| lengthSizeMinusOne (2b) | NALU 长度字段字节数 -1(常见值=3 → 4字节)
+--------------------------------------------------+
| numOfArrays (1B) | NALU 数组数量
+--------------------------------------------------+
| for (i=0; i<numOfArrays; i++) { |
| array_completeness (1b) | 是否包含所有该类型 NALU
| reserved (1b) | 保留位
| NAL_unit_type (6b) | NALU 类型(32=VPS,33=SPS,34=PPS)
| numNalus (2B) | 该数组中的 NALU 数量
| for (j=0; j<numNalus; j++) { |
| nalUnitLength (2B) | NALU 长度
| nalUnit (nalUnitLength bytes) | NALU 数据(去掉起始码)
| } |
| } |
+--------------------------------------------------+
HVCC 的结构与 AVCC 类似,但更加复杂,它包含了:
- Version:版本号。
- General Profile Idc、General Level Idc:通用配置的标识符。
- NALU Length Size:同样,定义了 NALU 长度的字节数,这对于 HEVC 的基本数据单元是必需的。
- Array Count:表示有多少个参数集数组,每个数组包含了特定类型的参数集(如 VPS、SPS、PPS)。
- Array Type、NALU Count、NALU Data:详细描述了每个参数集数组的类型、数量和具体数据。
这种结构化设计使得 HVCC 能够精确地传递 H.265 编码所需的复杂配置信息。
使用场景
文件封装(File Container)
这是 AVCC 和 HVCC 最经典的使用场景。当视频数据被封装进文件格式(如 MP4、FLV 或 MOV)时,这些配置信息通常会以一个特定的**“盒子”(box)或“标签”(tag)**的形式,被放置在文件头部。
-
MP4 文件:
- 对于 H.264 视频,MP4 文件的头部会有一个名为
avcC
的盒子。这个盒子里面包含了 H.264 的所有序列参数集(SPS)和图像参数集(PPS)。 - 对于 H.265 视频,MP4 文件则会有一个名为
hvcC
的盒子,它包含了 H.265 的视频参数集(VPS)、SPS 和 PPS。
无论是播放器还是视频编辑软件,在打开 MP4 文件时,都会首先解析这些盒子,以获取视频的基本配置,然后才能正确地解码和播放视频内容。
- 对于 H.264 视频,MP4 文件的头部会有一个名为
-
FLV 文件:
- 在 FLV 格式中,H.264 的配置数据会作为
AVC sequence header
放在scriptData
或第一个video tag
的开头。
- 在 FLV 格式中,H.264 的配置数据会作为
流媒体传输(Streaming)
在流媒体领域,AVCC 和 HVCC 的使用场景同样关键,但形式有所不同。在流式传输协议(如 HLS、DASH)中,这些配置信息通常也会被预先发送,以确保播放器能够快速开始解码。
- HLS (HTTP Live Streaming):
- 在 HLS 中,
.m3u8
播放列表文件会指向媒体片段(通常是.ts
文件)。 - 对于 H.264,SPS 和 PPS 通常会作为媒体片段的头部被嵌入到
.ts
文件中,或者在整个流的第一个.ts
文件中发送。 - 对于 H.265,VPS、SPS 和 PPS 也是以类似的方式处理。
- 在 HLS 中,
- DASH (Dynamic Adaptive Streaming over HTTP):
- 在 DASH 中,视频流通常被分割成小片段(
.mp4
或.ts
)。 - 对于基于 MP4 的 DASH 流,每个 MP4 片段的头部通常都会包含一个
avcC
或hvcC
盒子,确保每个片段都能独立解码,从而实现无缝的码率切换。
- 在 DASH 中,视频流通常被分割成小片段(
总结
特征 | AVCC | HVCC |
---|---|---|
视频标准 | H.264 (AVC) | H.265 (HEVC) |
主要参数集 | SPS, PPS | VPS, SPS, PPS |
复杂性 | 相对简单 | 更复杂,新增了 VPS,支持多层编码 |
用途 | 提供 H.264 视频流的配置信息 | 提供 H.265 视频流的配置信息 |
文件格式中 | MP4 文件中的 avcC box | MP4 文件中的 hvcC box |
核心理念 | 集中化参数集,提高编码与解码效率 | 集中化参数集,适应更复杂、更高效的编码标准 |