本文对 H.266/VVC 标准的两大开源实现------官方参考软件 VTM 与 Fraunhofer HHI 优化编码器 VVenC------进行全方位深度对比,涵盖项目定位、架构设计、编码性能、源码结构、工程实践等多个维度。
一、介绍:VVC 标准与两大实现
1.1 VVC 标准简述
2020 年 7 月,ITU-T VCEG 与 ISO/IEC MPEG 联合发布了 Versatile Video Coding (VVC) ,标准编号为 Rec. ITU-T H.266 | ISO/IEC 23090-3。作为 HEVC/H.265 的继任者,VVC 目标是在同等主观质量下节省约 50% 码率,代价是编码复杂度提升约 10 倍、解码复杂度提升约 2 倍。
VVC 的核心新增工具包括:
- QTMT 划分:四叉树 + 多类型树(二叉树/三叉树),取代 HEVC 的单一四叉树
- 67 种帧内预测模式(HEVC 仅 35 种)+ 宽角度帧内预测
- 仿射运动补偿(Affine Motion Compensation)
- 解码端运动矢量修正(DMVR)
- 自适应环路滤波器(ALF)+ 亮度映射与色度缩放(LMCS)
- 依赖量化(Dependent Quantization, DQ)
- 多变换选择(MTS):DCT-2 / DCT-8 / DST-7
- 屏幕内容编码(SCC)、360° 视频、HDR 等专用工具
1.2 两大实现概览
| 维度 | VTM | VVenC |
|---|---|---|
| 全称 | VVC Test Model | Fraunhofer Versatile Video Encoder |
| 开发方 | JVET(VCEG + MPEG 联合) | Fraunhofer HHI(JVET 核心成员) |
| 仓库地址 | vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM |
github.com/fraunhoferhhi/vvenc |
| 首次发布 | 2018 年(VTM 1.0) | 2020 年 9 月(VVenC 0.1) |
| 当前版本 | ~v25+(持续迭代) | v1.14.0(2026 年) |
| 许可证 | BSD 3-Clause | Clear BSD |
| 定位 | 参考软件:正确性优先 | 生产级编码器:速度与效率优先 |
| SIMD 优化 | 无 | SSE4.1/AVX/AVX2, NEON/SVE/SVE2, LSX |
| 多线程 | 无 | 混合并行(GOP + CTU + WPP + Tile) |
| 码率控制 | 基础 CQP | 单遍/双遍 VBR + CQF 封顶模式 |
| 感知优化 | 无 | XPSNR 驱动的 QPA |
一句话总结:VTM 是标准的"字典",VVenC 是标准的"产品"。VVenC 之于 VTM,就像 x265 之于 HM------前者面向工程落地,后者面向标准验证。
二、原理:架构设计与设计哲学
2.1 VTM 的设计哲学:正确性至上
VTM 的核心设计目标是 正确性、完整性和可读性。它要回答的问题是:"VVC 标准的每个语法元素和编码工具,是否被正确实现了?"
因此 VTM 的架构设计遵循以下原则:
- 工具全覆盖:标准中定义的每个编码工具都必须有对应实现,不论复杂度多高
- 代码可读性优先:变量命名规范、注释详尽,方便研究者理解算法逻辑
- 不做性能优化:不使用 SIMD 指令集、不支持多线程,保证代码逻辑清晰
- 编解码对称:同时包含完整编码器(EncoderApp)和解码器(DecoderApp)
- 配置文件驱动 :通过
cfg/目录下的配置文件控制编码参数
VTM 的本质是一个 标准验证平台。JVET 在每次会议提案中,都需要基于 VTM 进行 Core Experiment(核心实验),验证新工具的压缩增益。VTM 的代码结构直接映射了 VVC 标准的规范文本结构。
2.2 VVenC 的设计哲学:工程效率至上
VVenC 回答的问题是:"VVC 标准如何在实际产品中高效运行?"
VVenC 并非从零开发,而是 基于 VTM 10.0 裁剪后重建。具体做法是:
- 保留 VTM 的 VVC 划分框架(QTMT)、基本帧间/帧内预测和环路滤波
- 重新实现大部分编码工具:许多工具采用替代实现方案,在达到相同压缩增益的同时大幅提升速度
- 搜索空间剪枝:基于 Pareto 最优分析,为不同预设设计不同的搜索空间裁剪策略
- SIMD 全覆盖:对运动估计、变换、量化、环路滤波、仿射预测等关键路径进行 AVX2/NEON 向量化
- 混合多线程:GOP 级、帧级、CTU 级并行融合,通过单一线程池调度
2.3 架构对比
┌─────────────────────────────────────────────────────────────┐
│ VTM 架构 │
│ │
│ EncoderApp ──► EncoderLib ──► CommonLib │
│ │ │ │ │
│ cfg 文件驱动 全工具实现 共享数据结构 │
│ (无优化) (Picture, Slice, CU) │
│ │
│ 特点:单线程、无 SIMD、工具全覆盖、代码即规范 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ VVenC 架构 │
│ │
│ vvencapp ──┐ │
│ ├─► vvenc (C API) ──► EncoderLib ──► CommonLib │
│ vvencFFapp ┘ │ │ │ │
│ VVEncImpl 搜索剪枝+RDO 共享数据结构 │
│ │ │ │ │
│ NoMallocThreadPool SIMD (x86/ARM) │
│ (混合并行) (AVX2/NEON/SVE) │
│ │
│ 特点:多线程、SIMD 全覆盖、预设驱动、Pareto 优化搜索空间 │
└─────────────────────────────────────────────────────────────┘
2.4 模块对照
| 模块 | VTM | VVenC | 差异说明 |
|---|---|---|---|
| 应用层 | EncoderApp, DecoderApp + 工具链 | vvencapp, vvencFFapp | VVenC 仅含编码器,解码交给 VVdeC |
| API 层 | 无独立 API,直接编译为可执行文件 | C API (vvenc.h),ABI 稳定 |
VVenC 支持库集成 |
| 编码库 | EncoderLib(全工具) | EncoderLib(重写+剪枝) | VVenC 重新实现 MTS/ISP 等工具 |
| 公共库 | CommonLib | CommonLib(继承自 VTM) | 核心数据结构一致 |
| 解码库 | DecoderLib(完整) | DecoderLib(仅重建环路) | VVenC 仅保留编码所需的最小解码 |
| 线程池 | 无 | NoMallocThreadPool | VVenC 独有,零分配线程池 |
| SIMD | 无 | x86/ARM/LoongArch 全覆盖 | VVenC 独有 |
| 配置 | cfg 文件 + 命令行 | vvenc_config 结构体 + 预设 | VVenC 更面向 API 集成 |
三、公式:率失真优化与性能评价
3.1 率失真优化(RDO)
VVC 的编码决策核心是率失真优化,目标是在码率 R 和失真 D 之间找到最优平衡:
J=D+λ⋅RJ = D + \lambda \cdot RJ=D+λ⋅R
其中 λ\lambdaλ 由量化参数 QP 导出:
λ=0.85×2QP−123.0\lambda = 0.85 \times 2^{\frac{QP - 12}{3.0}}λ=0.85×23.0QP−12
对于分裂决策(VVC 的 QTMT 划分),使用 G-BFOS 算法递归求解:
Js=∑i=1kJs,i+λ⋅RsJ_s = \sum_{i=1}^{k} J_{s,i} + \lambda \cdot R_sJs=i=1∑kJs,i+λ⋅Rs
其中 Js,iJ_{s,i}Js,i 是第 iii 个子块的最优编码代价,RsR_sRs 是编码分裂决策的码率。VVC 有多种竞争分裂方式(二叉树、三叉树、水平/垂直),因此搜索空间随深度 指数增长,远超 HEVC 的线性增长。
VTM 对所有分裂模式进行完整的 RDO 计算;VVenC 通过启发式剪枝提前终止部分分支,以少量质量损失换取大幅速度提升。
3.2 BD-rate 评价方法
性能对比使用 Bjøntegaard Delta Rate (BD-rate):
- 在 4 个 QP 点(22, 27, 32, 37)分别编码
- 计算每个 QP 点的 PSNR 和码率
- 在 log-rate vs. PSNR 平面上进行三次多项式拟合
- 计算两条 RD 曲线之间的面积差
BD-rate=∫PSNRminPSNRmax(Rtest−Ranchor) dPSNR∫PSNRminPSNRmaxRanchor dPSNR×100%\text{BD-rate} = \frac{\int_{\text{PSNR}{\min}}^{\text{PSNR}{\max}} (R_{\text{test}} - R_{\text{anchor}}) \, d\text{PSNR}}{\int_{\text{PSNR}{\min}}^{\text{PSNR}{\max}} R_{\text{anchor}} \, d\text{PSNR}} \times 100\%BD-rate=∫PSNRminPSNRmaxRanchordPSNR∫PSNRminPSNRmax(Rtest−Ranchor)dPSNR×100%
BD-rate 为负值表示码率节省(越好)。质量指标使用加权 PSNR:
PSNRYUV=6×PSNRY+PSNRCb+PSNRCr8\text{PSNR}{\text{YUV}} = \frac{6 \times \text{PSNR}Y + \text{PSNR}{Cb} + \text{PSNR}{Cr}}{8}PSNRYUV=86×PSNRY+PSNRCb+PSNRCr
3.3 VVenC 感知优化模型
VVenC 引入了基于 XPSNR 心理视觉模型的感知 QP 自适应(QPA):
QPadapted=f(QPbase,σlocal2,XPSNRref)\text{QP}{\text{adapted}} = f(\text{QP}{\text{base}}, \sigma_{\text{local}}^2, \text{XPSNR}_{\text{ref}})QPadapted=f(QPbase,σlocal2,XPSNRref)
其中 σlocal2\sigma_{\text{local}}^2σlocal2 是局部方差,反映纹理复杂度。QPA 在纹理平坦区域适当提高 QP(降低质量),在纹理丰富区域降低 QP(提升质量),使主观质量更均匀。
四、图示:性能数据可视化
4.1 编码速度对比(VVenC 1.14.0 vs VTM-19.2)
以下数据基于 JVET 通用测试条件(CTC),AMD EPYC 7502P 32 核处理器,8 线程:
VVenC 各预设相对 VTM 的加速比(HD+UHD 平均)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
faster ████████████████████████████████████████████ 2400x
fast ██████████████████████████████████████ 1100x
medium █████████████████ 330x
slow ██████████ 87x
slower ██ 19x
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
VTM 基准 = 1x
4.2 压缩效率对比(BD-rate vs HM-17.0)
PSNR_YUV BD-rate vs HM-17.0(负值 = 码率节省)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
VTM CTC ██████████████████████████████████████████ -43.0%
VVenC slower █████████████████████████████████████████ -42.1%
VVenC slow ████████████████████████████████████ -39.1%
VVenC medium ███████████████████████████████ -35.1%
VVenC fast ████████████████████████ -25.8%
VVenC faster █████████████ -13.3%
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
0% = HM 性能基准
4.3 速度-质量 Pareto 前沿
质量提升 ↑
│
-43% ●──●─── VTM CTC
│ ╲
-42% │ ●─── VVenC slower
│ ╲
-39% │ ●─── VVenC slow
│ ╲
-35% │ ●─── VVenC medium ★推荐
│ ╲
-26% │ ●─── VVenC fast
│ ╲
-13% │ ●─── VVenC faster
│
└─────────────────────────────→ 编码速度
1x 19x 87x 330x 1100x 2400x
4.4 码率控制性能
VVenC 码率控制模式对比(Intra 周期 = 1s,BD-rate 相对固定 QP):
| 预设 | 单遍 BD-rate | 单遍时间 | 双遍 BD-rate | 双遍时间 |
|---|---|---|---|---|
| faster | +1.91% | 113% | +0.17% | 118% |
| fast | +2.24% | 106% | +0.91% | 115% |
| medium | +2.25% | 106% | +1.08% | 110% |
| slow | +2.46% | 105% | +1.26% | 107% |
| slower | +2.77% | 107% | +1.36% | 107% |
亮点:双遍码率控制仅增加约 7-18% 编码时间,BD-rate 偏差可低至 0.17%。码率偏差方面,单遍平均约 2%,双遍平均约 1.3%。
五、踩坑点:实际使用中的坑
坑 1:VTM 编码速度极慢
VTM 编码 1080p 视频可能需要 数分钟/帧 ,编码一段 10 秒 30fps 的 4K 视频可能需要 数天。
建议:日常开发测试用 VVenC,仅在需要标准一致性验证或算法研究时用 VTM。
坑 2:VVenC 的 medium 预设默认开启多线程
VVenC medium 预设默认启用多线程并行(WPP + 帧级并行),但某些 CI 环境下多线程会导致非确定性输出。
建议 :CI 测试中使用 --threads 1 强制单线程,或编译时启用 -DVVENC_FFP_CONTRACT_OFF=On 保证跨平台比特一致。
坑 3:ARM 平台浮点收缩问题
VVenC 在 ARM (AArch64) 上默认允许编译器使用 FMA(融合乘加)指令,这可能导致跨平台输出不匹配。
建议:
bash
# CMake 方式
cmake .. -DVVENC_FFP_CONTRACT_OFF=On
# Makefile 方式
make install-release ffp-contract-off=On
坑 4:VVenC 移除了 LMCS
从 v1.14.0 开始,VVenC 弃用并移除了 LMCS(亮度映射与色度缩放)工具。如果用旧版本编码的码流用新版本解码可能存在差异。
建议:升级版本前检查 changelog,关注工具移除信息。
坑 5:VTM 与 VVenC 配置参数不互通
VTM 使用 cfg 文件 + 命令行参数,VVenC 使用 vvenc_config 结构体 + 预设系统。两者的参数命名和含义有差异,不能直接迁移配置。
建议 :VVenC 的 vvencFFapp 提供了与 VTM 类似的细粒度控制参数,可以作为过渡桥梁。
坑 6:x265 的 SSE 编译要求
VVenC 要求 x86 架构至少支持 SSE 4.1。在老旧 CPU 上加载 libvvenc 会触发非法指令错误。
建议:v1.13.1 已修复此问题并明确要求 SSE 4.1,部署前确认目标平台支持。
坑 7:VTM 的 GitLab 仓库访问
VTM 托管在 Fraunhofer HHI 的内部 GitLab (vcgit.hhi.fraunhofer.de),国内访问可能不稳定。
建议 :使用 GitHub 镜像仓库(如 ELEC5870/VVCSoftware_VTM),或配置代理。
六、源码拆解:代码结构深度对比
6.1 VTM 源码结构
VVCSoftware_VTM/
├── source/
│ ├── App/ # 应用程序层
│ │ ├── EncoderApp/ # 编码器入口 (EncoderApp.cpp)
│ │ ├── DecoderApp/ # 解码器入口 (DecoderApp.cpp)
│ │ ├── BitstreamExtractorApp/ # 码流提取工具
│ │ ├── SEIFilmGrainApp/ # 胶片颗粒 SEI 工具
│ │ ├── SEIRemovalApp/ # SEI 删除工具
│ │ ├── StreamMergeApp/ # 码流合并工具
│ │ └── SubpicMergeApp/ # 子图合并工具
│ └── Lib/
│ ├── CommonLib/ # 公共库(编解码共用)
│ │ ├── CommonDef.h # 全局定义
│ │ ├── Picture.h/.cpp # 图像数据结构
│ │ ├── TypeDef.h # 类型定义(VVC 语法)
│ │ ├── Slice.h/.cpp # Slice 头解析与管理
│ │ ├── CodingStructure.h # 编码结构(CU/PU/TU)
│ │ ├── IntraPrediction.cpp # 帧内预测
│ │ ├── InterPrediction.cpp # 帧间预测
│ │ ├── TransformModule.cpp # 变换
│ │ ├── Quant.cpp # 量化
│ │ ├── LoopFilter.cpp # 环路滤波(DBF/SAO/ALF)
│ │ └── RomArrays.cpp # 查找表
│ ├── EncoderLib/ # 编码器专用库
│ │ ├── EncTop.h/.cpp # 编码器顶层控制
│ │ ├── EncGOP.cpp # GOP 管理
│ │ ├── EncSlice.cpp # Slice 编码
│ │ ├── EncCu.cpp # CU 级编码决策(核心)
│ │ ├── InterSearch.cpp # 帧间搜索
│ │ ├── IntraSearch.cpp # 帧内搜索
│ │ ├── MotionEstimation.cpp # 运动估计
│ │ ├── RateCtrl.cpp # 码率控制
│ │ └── EncReshape.cpp # LMCS 重塑
│ ├── DecoderLib/ # 解码器专用库
│ │ ├── DecTop.cpp # 解码器顶层
│ │ ├── DecSlice.cpp # Slice 解码
│ │ └── DecCu.cpp # CU 解码
│ └── Utilities/ # I/O 工具
│ ├── YuvFileIO.cpp # YUV 文件读写
│ └── MsgLog.cpp # 日志
├── cfg/ # 编码配置文件
│ ├── encoder_intra_vtm.cfg # 全帧内(AI)
│ ├── encoder_randomaccess_vtm.cfg # 随机存取(RA)
│ ├── encoder_lowdelay_vtm.cfg # 低延迟 B(LDB)
│ └── encoder_lowdelay_P_vtm.cfg # 低延迟 P(LDP)
├── doc/ # 技术文档与软件手册
└── CMakeLists.txt
VTM 代码特点:
EncCu.cpp是编码决策的核心,包含完整的 QTMT 划分搜索逻辑- 每个编码工具都有独立的搜索/决策函数,逻辑清晰但无任何性能优化
TypeDef.h包含所有编译时开关,通过宏定义控制工具启用
6.2 VVenC 源码结构
vvenc/
├── source/
│ ├── App/
│ │ ├── vvencapp/ # 简化编码器(预设驱动)
│ │ │ └── vvencapp.cpp
│ │ └── vvencFFapp/ # 全功能专家编码器
│ │ └── vvencFFapp.cpp
│ └── Lib/
│ ├── vvenc/ # 公共 API 层(C 接口)
│ │ ├── vvenc.h # 公共头文件
│ │ ├── vvencCfg.h # 配置结构体定义
│ │ ├── vvencimpl.cpp # API 实现封装
│ │ └── CMakeLists.txt # 构建 SIMD 分发库
│ ├── CommonLib/ # 公共库(继承自 VTM + 优化)
│ │ ├── CommonDef.h
│ │ ├── Picture.h/.cpp # 优化内存布局
│ │ ├── TypeDef.h
│ │ ├── DepQuant.cpp # 依赖量化(含 SIMD)
│ │ ├── x86/ # x86 SIMD 实现
│ │ │ ├── DepQuantX86.h
│ │ │ ├── FixMissingIntrin.h
│ │ │ └── ... # AVX2/SSE4.1 内联函数
│ │ ├── arm/ # ARM SIMD 实现
│ │ │ └── ... # NEON/SVE 内联函数
│ │ └── ... # 其余与 VTM 对应
│ ├── EncoderLib/ # 编码器库(重写 + 优化)
│ │ ├── EncLib.h/.cpp # 编码器顶层
│ │ ├── EncGOP.h/.cpp # GOP 管理 + 多线程调度
│ │ ├── EncPicture.cpp # 单帧编码协调
│ │ ├── EncStage.h # 编码阶段抽象(流水线)
│ │ ├── RateCtrl.h # 码率控制(单遍/双遍)
│ │ └── GOPCfg.h/.cpp # GOP 结构配置
│ ├── DecoderLib/ # 最小化解码器(仅重建环路)
│ └── apputils/ # 应用工具
│ ├── VVEncAppCfg.h # 命令行解析
│ └── YuvFileIO.h # YUV I/O
├── thirdparty/
│ └── simde/ # SIMDE 跨平台 SIMD 兼容层
├── include/vvenc/ # 公共头文件
├── cfg/ # 配置文件
├── test/ # 测试套件
│ ├── vvenclibtest/ # 库单元测试
│ └── vvencinterfacetest/ # API 接口测试
└── CMakeLists.txt
6.3 关键代码差异
(1) 多线程模型
VTM :完全单线程,EncGOP::compressGOP() 顺序处理每一帧。
VVenC :混合并行模型,核心在 EncGOP 中:
cpp
// VVenC EncGOP.h 中的关键成员
NoMallocThreadPool* m_threadPool; // 零分配线程池
PicList m_procList; // 正在处理的图片列表
PicList m_freePicEncoderList; // 空闲图片编码器
// 并行策略:
// 1. GOP 级:多个 GOP 可并行处理
// 2. 帧级:同一 GOP 内无依赖关系的帧可并行
// 3. CTU 级:WPP(Wavefront Parallel Processing)
// 4. Tile 级:独立 Tile 并行编码
VVenC 通过 m_mtProfile 参数控制并行强度(0-3),-1 为自动选择。
(2) SIMD 优化分发
VTM:直接使用标量 C++ 代码。
VVenC:运行时 SIMD 分发机制:
cpp
// VVenC TypeDef.h 中的 SIMD 架构枚举
enum SIMD_E_ARCH {
SCALAR = 0,
SSE41, // x86 最低要求
SSE42,
AVX,
AVX2, // 主要优化目标
AVX512,
NEON, // ARM
SVE,
SVE2,
LSX, // LoongArch64
};
// 编译时分离构建,运行时函数指针分发
// 避免编译器将高级指令泄漏到主二进制中
VVenC 将 SIMD 代码编译为独立的目标文件(如 vvenc_x86_simd),在初始化时根据 CPU 特性选择最优代码路径。
(3) 搜索空间剪枝
VTM :EncCu::compressCtu() 对每个 CTU 进行完整的 QTMT 递归搜索,测试所有分裂模式。
VVenC:基于预设的 Pareto 优化配置,在不同预设下启用不同的剪枝策略:
faster:激进的提前终止,仅测试少量模式medium:平衡模式,关键决策点保留完整搜索slower:接近 VTM 的完整搜索,但仍有 SIMD 加速
(4) 码率控制
VTM:基础 CQP(固定 QP),支持简单的码率控制。
VVenC:多模式码率控制:
- 单遍 VBR:GOP 级别控制,带短时前瞻窗口
- 双遍 VBR:首遍收集全序列统计,二遍优化分配
- CQF 封顶模式(v1.12.0+):结合 QP 与 QPA,可设最大码率上限
(5) API 设计
VTM :无独立 API,直接编译为 EncoderApp 可执行文件,参数通过命令行和 cfg 文件传入。
VVenC:提供 C 语言 API,ABI 稳定:
c
// VVenC C API 典型使用流程
vvenc_config cfg;
vvenc_config_default(&cfg);
vvenc_config_parse(&cfg, "preset", "medium");
vvenc_config_parse(&cfg, "qp", "32");
vvenc_encoder* enc = vvenc_encoder_create();
vvenc_encoder_init(enc, &cfg);
// 逐帧编码
vvencYUVBuffer yuvBuf;
vvencAccessUnit au;
vvenc_encoder_encode(enc, &yuvBuf, &au, &ret);
// 刷新剩余码流
vvenc_encoder_flush(enc, &au);
// 释放
vvenc_encoder_close(enc);
七、效果对比:综合评测
7.1 编码速度
VVenC 在所有预设下都远超 VTM:
| 对比项 | VTM-19.2 | VVenC medium | VVenC faster |
|---|---|---|---|
| 相对速度 | 1x | 330x | 2400x |
| 1080p 编码时间 | ~小时级 | ~秒级 | ~亚秒级 |
| 4K 编码时间 | ~天级 | ~分钟级 | ~秒级 |
7.2 压缩效率
VVenC slower 预设的压缩效率已非常接近 VTM CTC 配置:
| 对比项 | VTM CTC | VVenC slower | VVenC medium |
|---|---|---|---|
| PSNR_YUV BD-rate vs HM | -43.0% | -42.1% | -35.1% |
| MS-SSIM BD-rate vs HM | -47.0% | -45.6% | -39.4% |
| 与 VTM 的效率差距 | 基准 | ~0.9% | ~7.9% |
7.3 功能完整度
| 功能 | VTM | VVenC |
|---|---|---|
| 全部 VVC 编码工具 | ✅ 完整 | ⚠️ 大部分(LMCS 已移除) |
| 编码器 | ✅ | ✅ |
| 解码器 | ✅ 完整 | ❌ 仅重建环路(用 VVdeC) |
| 一致性测试码流 | ✅ | ❌ |
| 屏幕内容编码 (SCC) | ✅ 完整 | ⚠️ 检测+部分优化 |
| 多层扩展 | ✅ | ❌ |
| 数字签名 SEI | ✅ (OpenSSL) | ❌ |
| HDR/WCG | ✅ | ✅ (PQ/HLG/BT.2020) |
| 码率控制 | 基础 | ✅ 单遍/双遍/CQF |
| 感知优化 | ❌ | ✅ XPSNR QPA |
| 多线程 | ❌ | ✅ 混合并行 |
| SIMD | ❌ | ✅ 全平台 |
| C API 集成 | ❌ | ✅ ABI 稳定 |
7.4 适用场景推荐
| 场景 | 推荐 | 理由 |
|---|---|---|
| VVC 标准研究/学习 | VTM | 代码即规范,工具全覆盖 |
| 算法提案验证 | VTM | JVET 要求基于 VTM 出实验结果 |
| 一致性测试码流生成 | VTM | 唯一权威来源 |
| 商用编码产品开发 | VVenC | 速度快、有 API、可集成 |
| 视频流媒体服务 | VVenC | medium 预设 + 码率控制 |
| 实时编码/直播 | VVenC | faster 预设 + 低延迟配置 |
| 离线高质量编码 | VVenC | slower 预设,接近 VTM 质量 |
| 跨平台部署 | VVenC | SIMD 全覆盖 + C API |
| 编解码器性能分析 | 两者 | VTM 做上限基准,VVenC 做工程基准 |
7.5 生态关系图
VVC 标准 (H.266 / ISO 23090-3)
│
┌──────────┴──────────┐
│ │
JVET 标准化 Fraunhofer HHI
(VCEG + MPEG) (JVET 核心成员)
│ │
┌────┴────┐ ┌─────┴─────┐
│ VTM │ │ VVenC │
│ 参考软件 │◄──基于──│ 优化编码器 │
└────┬────┘ └─────┬─────┘
│ │
┌────┴────┐ ┌─────┼─────┐
│EncoderApp│ │vvencapp │
│DecoderApp│ │vvencFFapp│
│ 工具链 │ │libvvenc │
└─────────┘ └─────┬─────┘
│
┌─────────┴─────────┐
│ │
VVdeC FFmpeg VVC
(优化解码器) (集成支持)
八、版本演进与未来
8.1 VTM 版本里程碑
| 版本 | 时间 | 里程碑 |
|---|---|---|
| VTM 1.0 | 2018 | 初版,基于 BMS 框架 |
| VTM 5.0 | 2019 | 主要编码工具基本成型 |
| VTM 10.0 | 2020.07 | 配合 VVC 标准正式发布 |
| VTM 13.0 | 2021 | CTC 基准版本 |
| VTM 19.0 | 2023 | VVenC 性能对比锚点 |
| VTM 25+ | 2026 | 持续迭代,增加 SEI 扩展 |
8.2 VVenC 版本演进
| 版本 | 时间 | 关键改进 |
|---|---|---|
| 0.1 | 2020.09 | 首版,基于 VTM 10.0,4 个预设 |
| 1.0.0 | 2021.05 | 5 个预设,多线程支持 |
| 1.7.0 | 2022 | ARM SIMD 优化,切换至 EPYC 测试平台 |
| 1.11.0 | 2024.02 | 帧间并行完成,矢量化 DQ,SCC 检测改进 |
| 1.12.0 | 2024.06 | CQF 码率封顶模式,MTProfile 参数 |
| 1.13.0 | 2025 | 大量 ARM SVE 优化,多 GOP 并行,胶片颗粒分析 |
| 1.14.0 | 2026 | 移除 LMCS,ARM SVE/SVE2 完善,FFP 收缩控制 |
8.3 第三方生态
除 VTM 和 VVenC 外,VVC 生态中还有其他值得关注的实现:
- VVdeC:Fraunhofer HHI 的优化 VVC 解码器,VVenC 的解码端搭档
- uvg266:学术开源 VVC 帧内编码器,单线程比 VVenC 快 2 倍以上
- OpenVVC:INSA Rennes 开发的实时 VVC 解码器,支持 FFplay/VLC 集成
- FFmpeg VVC:FFmpeg 内置的 VVC 解码支持
- Intel IPEX / NVIDIA NVENC:硬件加速 VVC 编码方案
九、总结
VTM 和 VVenC 并非竞争关系,而是 互补的生态伙伴:
-
VTM 是 VVC 标准的"金标准"------它定义了 VVC 编码的理论上限,是所有提案验证的基准。代码即规范,每一个函数都映射着标准文本的一条语义规则。它的价值在于 正确性和权威性,而非工程效率。
-
VVenC 是 VVC 标准的"工程化"------它在 VTM 的基础上重新设计架构,通过 SIMD 向量化、混合多线程、搜索空间剪枝和感知优化,将 VVC 从"实验室"推向了"生产线"。它的价值在于 实用性和性能。
对于视频编码研究者和工程师来说,理解两者的差异和关系至关重要:用 VTM 学习标准,用 VVenC 构建产品。在实际项目中,可以先基于 VTM 验证算法思路,再在 VVenC 框架中实现工程优化。
VVenC 当前 1.14.0 版本的 medium 预设(多线程 + 可选 QPA)已被官方推荐为编码速度与压缩性能的最佳平衡点------相比 VTM 加速 330 倍,相比 HM 节省 35% 码率,且仅需 8 线程即可实现。对于大多数实际应用场景,这已经是一个可以直接部署的方案。
参考资料
- B. Bross et al., "Overview of the Versatile Video Coding (VVC) Standard and its Applications," IEEE TCSVT, 2021.
- A. Wieckowski et al., "VVenC: An Open And Optimized VVC Encoder Implementation," IEEE ICMEW, 2021.
- A. Wieckowski et al., "VVC Search Space Analysis Including an Open, Optimized Implementation," IEEE TCSVT, 2022.
- VTM 仓库: https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM
- VVenC 仓库: https://github.com/fraunhoferhhi/vvenc
- VVenC Wiki (Encoder Performance): https://github.com/fraunhoferhhi/vvenc/wiki/Encoder-Performance
- VVenC DeepWiki: https://deepwiki.com/fraunhoferhhi/vvenc
- H. Touzani et al., "Complexity Analysis of the VVenC Versus VVC Encoder," IJEECS, 2024.
- ITU-T H.266 / ISO/IEC 23090-3 (VVC Standard), 2020.