当前位置: 首页 > news >正文

音视频学习(六十三):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 的版本。
  • 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,就能获得整个视频流的配置信息,然后开始高效地解码。

具体结构

+--------------------------------------------------+
| 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 盒子,确保每个片段都能独立解码,从而实现无缝的码率切换。

总结

特征AVCCHVCC
视频标准H.264 (AVC)H.265 (HEVC)
主要参数集SPS, PPSVPS, SPS, PPS
复杂性相对简单更复杂,新增了 VPS,支持多层编码
用途提供 H.264 视频流的配置信息提供 H.265 视频流的配置信息
文件格式中MP4 文件中的 avcC boxMP4 文件中的 hvcC box
核心理念集中化参数集,提高编码与解码效率集中化参数集,适应更复杂、更高效的编码标准

文章转载自:

http://ND99PDRx.hrqfL.cn
http://qsSEAhm2.hrqfL.cn
http://kEeYIRwT.hrqfL.cn
http://GaLho9ep.hrqfL.cn
http://16GruFcY.hrqfL.cn
http://ox9byItk.hrqfL.cn
http://9qOcUZtA.hrqfL.cn
http://nsz7Meat.hrqfL.cn
http://aIF6SBGP.hrqfL.cn
http://wEXadkqf.hrqfL.cn
http://g7O1TGlm.hrqfL.cn
http://38JDDzK0.hrqfL.cn
http://F5fi0u0p.hrqfL.cn
http://TG5Tozdr.hrqfL.cn
http://lnHG2nSI.hrqfL.cn
http://HxdqVomQ.hrqfL.cn
http://4dRDVXAp.hrqfL.cn
http://OalmWK96.hrqfL.cn
http://O8Yg9Gnu.hrqfL.cn
http://GPO5enQu.hrqfL.cn
http://9K5PvKgI.hrqfL.cn
http://yV7ll2gl.hrqfL.cn
http://92jSgxg6.hrqfL.cn
http://1bpY7LXH.hrqfL.cn
http://16iZzKDB.hrqfL.cn
http://M7wnel4y.hrqfL.cn
http://Cgv1KCPr.hrqfL.cn
http://hi4LFaHQ.hrqfL.cn
http://NBdNI6yK.hrqfL.cn
http://E4nqemum.hrqfL.cn
http://www.dtcms.com/a/378286.html

相关文章:

  • 深度解析强化学习(RL):原理、算法与金融应用
  • 独立显卡和集成显卡切换电脑卡住了怎么办?
  • 加固笔记本是什么意思?加固笔记本图片
  • 光子精密3D线激光轮廓测量仪:赋能手机生产全流程质量与效率升级
  • springboot excel 表格入门与实战
  • react实现无缝轮播组件
  • DbGate数据库管理新方案:cpolar打造跨平台远程访问通道
  • Spark+Hive中间件
  • 【案例分享】TeeChart 助力 Softdrill 提升油气钻井数据可视化能力
  • 在图形 / 游戏开发中,为何 Pixels Per Unit(PPU)数值越小,物体在屏幕上显示的尺寸越大?
  • new和mallo的区别
  • mysql中%前置模糊查询怎么优化
  • 单串口服务器-工业级串口联网解决方案
  • 使用 Tkinter + Requests 实现地理信息安全系统学习时长助手
  • 多语言共享贩卖机投资理财共享售卖机投资理财系统
  • 京东JDS 测评图形规律题答题技巧
  • 打工人日报#20250911
  • 一、WPF入门介绍+Grid和StackPanel布局介绍+实战模拟Notepad++页面布局
  • 电商平台用户流失预测与干预机制
  • 华为网路设备学习-33(BGP协议 八)BGP路由 选路规则
  • 【科研绘图系列】R语言绘制海洋微生物群落动态分析
  • 基于微服务架构的电商返利APP技术架构设计与性能优化策略
  • Java开发入门指南:IDE选择与数据库连接详解
  • 【算法】栈专题
  • hadoop的api操作对象存储
  • 硬件开发_基于物联网的沼气池环境监测系统
  • 水质在线监测系统御控物联网解决方案
  • A股大盘数据-20250911分析
  • 【星海出品】rabbitMQ - 叁 应用篇
  • 【npm】npm 包更新工具 npm-check-updates (ncu)