音视频学习(六十三):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,就能获取所有必要的配置参数,并用这些参数来解码后续的整个视频序列,大大提高了效率。

具体结构

diff 复制代码
+----------------------------+
| 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 的版本。
  • ProfileLevelProfile Compatibility:这些字段与 SPS 中的信息对应,指示了视频的编码规格。
  • NALU Length Size:一个非常关键的字段,它定义了后续每个 NALU(网络抽象层单元,H.264 的基本数据单元)长度的字节数。这使得解码器能够准确地知道每个数据单元的边界。
  • SPS Count & SPS Data:SPS 的数量和实际的 SPS 数据。
  • PPS Count & PPS Data:PPS 的数量和实际的 PPS 数据。

通过这种结构化的方式,AVCC 确保了解码器能够以最高效的方式获取并应用 H.264 的配置参数。

HVCC

HVCCH.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,就能获得整个视频流的配置信息,然后开始高效地解码。

具体结构

diff 复制代码
+--------------------------------------------------+
| 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 IdcGeneral Level Idc:通用配置的标识符。
  • NALU Length Size:同样,定义了 NALU 长度的字节数,这对于 HEVC 的基本数据单元是必需的。
  • Array Count:表示有多少个参数集数组,每个数组包含了特定类型的参数集(如 VPS、SPS、PPS)。
  • Array TypeNALU CountNALU 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 文件时,都会首先解析这些盒子,以获取视频的基本配置,然后才能正确地解码和播放视频内容。

  • FLV 文件:

    • 在 FLV 格式中,H.264 的配置数据会作为 AVC sequence header 放在 scriptData 或第一个 video tag 的开头。

流媒体传输(Streaming)

在流媒体领域,AVCC 和 HVCC 的使用场景同样关键,但形式有所不同。在流式传输协议(如 HLS、DASH)中,这些配置信息通常也会被预先发送,以确保播放器能够快速开始解码。

  • HLS (HTTP Live Streaming) :
    • 在 HLS 中,.m3u8 播放列表文件会指向媒体片段(通常是 .ts 文件)。
    • 对于 H.264,SPS 和 PPS 通常会作为媒体片段的头部 被嵌入到 .ts 文件中,或者在整个流的第一个 .ts 文件中发送。
    • 对于 H.265,VPS、SPS 和 PPS 也是以类似的方式处理。
  • DASH (Dynamic Adaptive Streaming over HTTP) :
    • 在 DASH 中,视频流通常被分割成小片段(.mp4.ts)。
    • 对于基于 MP4 的 DASH 流,每个 MP4 片段的头部通常都会包含一个 avcChvcC 盒子,确保每个片段都能独立解码,从而实现无缝的码率切换。

总结

特征 AVCC HVCC
视频标准 H.264 (AVC) H.265 (HEVC)
主要参数集 SPS, PPS VPS, SPS, PPS
复杂性 相对简单 更复杂,新增了 VPS,支持多层编码
用途 提供 H.264 视频流的配置信息 提供 H.265 视频流的配置信息
文件格式中 MP4 文件中的 avcC box MP4 文件中的 hvcC box
核心理念 集中化参数集,提高编码与解码效率 集中化参数集,适应更复杂、更高效的编码标准
相关推荐
victory04313 小时前
疾病语音数据集 WAV格式音频
深度学习·音视频
电商API_180079052474 小时前
淘宝商品视频批量自动化获取的常见渠道分享
java·爬虫·自动化·网络爬虫·音视频
音视频牛哥5 小时前
端–边–云一体的实时音视频转发:多路RTSP转RTMP推送技术深度剖析
音视频·大牛直播sdk·rtsp2rtmp·rtsp转rtmp推送·rtsp to rtmp·rtsp摄像头转rtmp推送·rtsp转发rtmp
iphone1085 小时前
视频版权保护有哪些好用的加密方案
音视频·加密·加密软件·视频加密·加密技术·视频安全·视频版权保护
淮北也生橘125 小时前
Linux的V4L2视频框架学习笔记
linux·笔记·学习·音视频·嵌入式linux
却道天凉_好个秋6 小时前
音视频学习(六十四):avc1 hvc1和hev1
音视频·avc·hvc·hev
wang_chao1187 小时前
RK3399平台ffmpeg-VPU硬编码录制USB摄像头视频、H264或MJPEG编码
ffmpeg·音视频
froxy7 小时前
音频中的PDM、PCM概念解读
音视频·pcm
Zender Han18 小时前
Flutter 视频播放器——flick_video_player 介绍与使用
android·flutter·ios·音视频