【音视频】VP8 与 VP9 技术详解及与 H.264 H.265 的对比
参考文章:https://blog.csdn.net/www_dong/article/details/147030466?ops_request_misc=&request_id=&biz_id=102&utm_term=VP8%E5%92%8CVP9&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-147030466.142v102pc_search_result_base6&spm=1018.2226.3001.4187
VP8 与 VP9 技术详解及与 H.264/H.265 的对比
第一部分:VP8 技术详解
VP8 是由原 On2 Technologies 开发、后被 Google 收购并开源的视频压缩标准,核心定位是免费替代 H.264,在 Web 实时通信和开源视频生态中应用广泛。
一、VP8 基础信息
项目 | 说明 |
---|---|
全称 | Video Processing 8 |
发布者 | On2 Technologies(2010 年被 Google 收购,后续由 Google 维护) |
定位 | 开源免费视频压缩标准,主打中低码率场景,直接竞争对手为 H.264(Baseline Profile) |
核心应用场景 | 1. WebRTC 实时视频通信(如 Zoom、浏览器视频通话); 2. HTML5 <video> 标签(封装为 WebM 格式); 3. FFmpeg、SRS 等开源流媒体框架; 4. YouTube 早期视频编码 |
开源实现 | libvpx(Google 官方维护,是 VP8/VP9/AV1 的核心编解码库) |
二、VP8 编解码核心流程
VP8 采用 “基于块的混合视频编码框架”,与 H.264 思路相似,核心是通过 “预测 - 变换 - 量化 - 熵编码” 消除视频冗余,
具体步骤如下:
-
帧分块:将每帧划分为固定大小的16x16 宏块(Macroblock),宏块可进一步拆分为 4x4、8x8 子块;
-
预测模式选择:对每个块选择 “帧内预测” 或 “帧间预测”:
- 帧内预测(Intra):利用当前帧已解码的邻近像素(如水平、垂直方向)预测当前块值,支持 DC 预测、水平预测等基础模式;
- 帧间预测(Inter):利用前一帧(Last 帧)、参考帧(Golden/AltRef 帧,最多 3 个参考帧)的块进行预测,支持1/4 像素精度的运动估计;
-
残差计算与变换:计算 “预测值” 与 “原始值” 的差值(残差),对残差使用4x4 或 16x16 DCT(离散余弦变换) 转换为频域系数;
-
量化:对频域系数进行量化(降低精度),通过调整量化参数(QP)平衡 “码率” 与 “画质”(QP 越大,压缩越强、画质越差);
-
熵编码:使用轻量级 Bool 编码器(Boolean Arithmetic Coding) 对量化后的系数和预测模式等语法元素进行压缩,输出最终比特流。
三、VP8 帧结构
VP8 的每一帧(Frame)由 “帧头” 和 “帧数据” 两部分组成,帧头区分 “关键帧” 和 “非关键帧”,结构如下:
1. 共通帧头(Frame Tag,3 字节)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|I|P| Version | Partition 0 Length (19 bits) |
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
所有帧(关键帧 / 非关键帧)的起始部分,包含解码器必需的控制信息:
比特位分配 | 含义 |
---|---|
I(1bit) | 关键帧标志:0 = 关键帧(I 帧,可独立解码),1 = 非关键帧(P 帧,需参考前帧) |
P(1bit) | 显示允许标志:0 = 允许显示,1 = 不显示(极少使用,主要用于临时参考帧) |
Version(3bit) | 编码器版本号(固定为 0,后续未更新) |
Partition 0 Length(19bit) | 第一个分区(Partition 0)的长度(分区是帧数据的拆分单元) |
2. 关键帧附加头(7 字节,仅关键帧有)
关键帧需携带完整图像元信息,在 3 字节共通帧头后追加7字节:
0x9D 0x01 0x2A // Start code (固定标志)
2 字节: 宽度 + flags
2 字节: 高度 + flags
- 固定起始码(3 字节):
0x9D 0x01 0x2A
(用于解码器识别关键帧); - 宽度 + 标志(2 字节):存储图像宽度(需按 16 像素对齐)及颜色空间标志;
- 高度 + 标志(2 字节):存储图像高度(需按 16 像素对齐)及颜色空间标志。
3. 帧数据(Frame Partitions)
帧数据拆分为多个分区(Partition 0~N),分工明确:
[ Partition 0 ] [ Partition 1 ] [ Partition 2 ] ... [ Partition N ]
- Partition 0:存储控制信息(预测模式、宏块类型、参考帧索引等),需完整接收才能解码后续分区;
- Partition 1~N:存储宏块残差的频域系数(实际视频数据),可并行解码。
VP8 帧结构简化图示
VP8 Frame:
├── Frame Tag (3 bytes)
│ ├── Key Frame? (I bit)
│ └── Partition 0 Length
├── [If Key Frame]
│ ├── Start Code (0x9D012A)
│ ├── Width, Height
├── Partition 0 (mode, control info)
├── Partition 1+ (macroblock residuals)
四、VP8 核心技术特点
- 宏块与分块:固定 16x16 宏块,支持 4x4/8x8 子块,每个宏块最多 4 个运动矢量;
- 参考帧:最多支持 3 个参考帧(Last:最近帧、Golden:高质量参考帧、AltRef:备用参考帧);
- 熵编码:采用轻量级 Bool 编码,比 H.264 的 CAVLC 更高效,但复杂度低于 CABAC;
- 去块滤波:内置环路去块滤波器,消除宏块边界伪影(Blocking Artifacts);
- 局限性:不支持 B 帧、不支持可伸缩编码(SVC)、仅支持 8-bit YUV 4:2:0 色深(无法满足 HDR 需求)。
1. 编码命令(vpxenc)
将 Y4M 格式视频编码为 VP8(WebM 封装):
# 基础编码:比特率1000kbps,4线程
vpxenc input.y4m --codec=vp8 --output=output.webm --threads=4 --target-bitrate=1000
# 高质量编码:启用2遍编码(RDO优化)
vpxenc input.y4m --codec=vp8 --passes=2 --pass=1 --target-bitrate=1500 --output=/dev/null
vpxenc input.y4m --codec=vp8 --passes=2 --pass=2 --target-bitrate=1500 --output=high_quality.webm
2. 解码命令(vpxdec)
解码 VP8 视频并输出 Y4M 原始格式:
vpxdec output.webm --output-decoded=decoded.y4m
第二部分:VP9 技术详解
VP9 是 Google 在 2013 年发布的 VP8 升级版,核心定位是开源替代 H.265(HEVC),在压缩效率、功能扩展性上全面超越 VP8,成为 YouTube、浏览器等场景的主流编码格式
一、VP9 基础信息
项目 | 说明 |
---|---|
发布者 | Google(2013 年开源,基于 VP8 演进) |
定位 | 高效开源视频压缩标准,主打中高码率场景,竞争对手为 H.265(Main Profile) |
核心应用场景 | 1. YouTube 主流编码(超过 70% 的视频采用 VP9); 2. Chrome/Firefox/Edge/Android 原生支持; 3. WebRTC 高清视频(4K/8K 场景); 4. 开源 HDR 视频(封装为 WebM/Matroska) |
核心优势 | 比 VP8 压缩效率提升 30%-50%,比 H.264 提升 50% 以上,且完全开源免费 |
二、VP9 与 VP8 的核心特性对比
VP9 在 VP8 基础上进行了全方位升级,关键差异如下:
特性 | VP8 | VP9 |
---|---|---|
宏块 / 超级块 | 固定 16x16 宏块 | 64x64 超级块(可递归划分为 4x4 子块) |
参考帧数量 | 最多 3 帧(Last/Golden/AltRef) | 最多 8 帧(支持双向预测) |
运动估计精度 | 1/4 像素 | 1/8 像素(提升运动预测准确性) |
分块模式 | 仅对称分块(4x4/8x8/16x16) | 支持 10 种模式(含非对称分块,如 32x16) |
变换类型 | 仅 DCT(4x4/16x16) | DCT+ADST(适应纹理细节,4x4/8x8/16x16/32x32/64x64) |
色深支持 | 仅 8-bit YUV 4:2:0 | 8/10/12-bit,支持 BT.2020(HDR) |
并行解码 | 有限支持(基于宏块) | Tile-based 并行(按列分割,多线程友好) |
可伸缩编码(SVC) | 不支持 | 支持(空间 / 时间 / 质量伸缩) |
熵编码 | 轻量级 Bool 编码 | 上下文自适应算术编码(类似 H.265 的 CABAC) |
三、VP9 帧结构
VP9 帧结构相比 VP8 更灵活,分为 “非压缩帧头”“压缩帧头”“Tile 数据” 三部分,支持关键帧(I 帧)、非关键帧(P 帧 / B 帧):
1. 非压缩帧头(Uncompressed Header)
不经过熵编码,解码器可直接解析,包含全局控制信息:
核心字段 | 含义 |
---|---|
Frame Marker(2bit) | 固定为0b10 (VP9 帧的标识,避免与其他格式混淆) |
Profile(2bit) | 编码配置等级:0=8-bit 4:2:0;1=8-bit 4:2:2/4:4:4;2=10/12-bit 4:2:0;3=10/12-bit 4:2:2/4:4:4 |
Frame Type(1bit) | 0 = 关键帧(I 帧),1 = 非关键帧(P/B 帧) |
宽高信息(32bit×2) | 编码宽高 + 显示宽高(支持 “编码宽高≠显示宽高”,适应不同屏幕) |
Tile Info | Tile 划分信息(行数 / 列数,如 “2 行 4 列” 表示 8 个 Tile) |
滤波 / 量化参数 | 环路滤波强度、量化参数(QP)、分段控制(Segmentation)参数 |
2. 压缩帧头(Compressed Header)
经过熵编码,包含块级控制信息:
- 预测模式(帧内 / 帧间);
- 块划分方式(64x64→4x4 的递归分块);
- 运动矢量参考索引、运动矢量预测(MVP);
- 变换大小(如 4x4/8x8)与变换类型(DCT/ADST)。
3. Tile 数据(Tile Data)
VP9 的核心创新之一,将图像按列分割为多个Tile(瓦片),是实际经过编码的视频图像像素信息,每个 Tile 可独立解码(多线程并行),包含:
- 宏块残差的频域系数;
- 熵编码的 Token(语法元素);
- 上下文概率表更新信息。
VP9 帧结构简化图示
VP9 Frame
├─ 非压缩帧头(Uncompressed Header)
│ ├─ Frame Marker(0b10)、Profile、Frame Type
│ ├─ 宽高/显示宽高、Tile划分
│ └─ 滤波/量化/分段参数
├─ 压缩帧头(Compressed Header,熵编码)
│ ├─ 预测模式、块划分方式
│ └─ 运动矢量、变换配置
└─ Tile数据(Tile Data)├─ Tile 0:独立解码单元(含残差+Token)├─ Tile 1:...└─ Tile N:...
四、VP9 核心技术创新
1. 超级块与灵活分块
- 超级块(Superblock):固定 64x64 像素,替代 VP8 的 16x16 宏块,减少块边界数量;
- 递归分块:超级块可递归划分为 32x32、16x16、8x8、4x4,支持非对称分块(如 32x16、16x32),对 “纹理复杂区域(小块)” 和 “平滑背景(大块)” 自适应优化。
2. 增强型预测
- 帧内预测:支持 10 种模式(DC、水平、垂直、6 种方向模式),覆盖更多纹理方向;
- 帧间预测:支持 8 个参考帧、双向预测(B 帧)、全局运动建模(如镜头平移场景),1/8 像素精度运动估计(比 VP8 更细腻)。
3. 自适应变换与量化
- 混合变换:4x4/8x8 块支持 DCT(平滑区域)和 ADST(纹理边缘区域),32x32/64x64 块仅用 DCT;
- 分段量化(Segmentation):将图像划分为多个 “分段(Segment)”,每个分段可设置独立 QP(如人脸区域用低 QP 保画质,背景用高 QP 降码率)。
4. Tile-based 并行处理
- 将图像按列分割为 Tile(如 1920x1080 图像分为 “2 行 4 列” 8 个 Tile);
- 每个 Tile 的编码 / 解码完全独立,支持多线程并行(如 8 核 CPU 可同时处理 8 个 Tile),大幅提升实时编码 / 解码速度。
5. HDR 支持
- 支持 10/12-bit 色深、BT.2020 色域(VP8 仅 8-bit BT.601);
- 配合 PQ(感知量化)或 HLG(混合对数伽马)传输函数,可编码 HDR 视频(如 YouTube 的 4K HDR 内容)。
五、VP9 实用工具(基于 libvpx)
1. 编码命令(vpxenc)
编码 4K HDR 视频为 VP9(WebM 封装):
# 4K HDR编码:10-bit,BT.2020,比特率8000kbps
vpxenc input_4k_10bit.y4m --codec=vp9 --profile=2 --bit-depth=10 --color-space=bt2020 --target-bitrate=8000 --threads=8 --output=4k_hdr.webm
# 可伸缩编码(SVC):2层(720p基础层+1080p增强层)
vpxenc input.y4m --codec=vp9 --svc-temporal-layers=1 --svc-spatial-layers=2 --spatial-layer-config=0:720p:3000,1:1080p:6000 --output=svc_stream.webm
2. 解码命令(vpxdec)
解码 VP9 HDR 视频并输出 10-bit Y4M:
vpxdec 4k_hdr.webm --output-decoded=decoded_10bit.y4m --bit-depth=10
第三部分:VP8/VP9 与 H.264/H.265 的全面对比
VP8/VP9 与 H.264/H.265(HEVC)是当前主流视频编码标准,核心差异集中在授权模式、压缩效率、复杂度、硬件支持四大维度,以下从关键指标展开对比:
一、核心指标对比表
对比维度 | VP8 | VP9 | H.264(AVC) | H.265(HEVC) |
---|---|---|---|---|
授权模式 | 开源免费(无专利费) | 开源免费(Google 承诺永久免费) | 专利池授权(MPEG LA 等,需支付 royalties) | 专利池授权(多联盟,费用更高、复杂度高) |
压缩效率 | 低(比 H.264 低 10%-20%) | 高(比 H.264 高 50%,比 H.265 低 10%-20%) | 中(基准线,广泛用于低码率场景) | 极高(比 H.264 高 60%+,4K/8K 首选) |
编码复杂度 | 低(适合移动端 / 嵌入式) | 中高(比 H.264 高 3-5 倍,比 H.265 低) | 低 - 中(Baseline 复杂度低,High 复杂度高) | 高(比 H.264 高 5-10 倍,硬件依赖强) |
解码复杂度 | 低(可软件实时解码) | 中(Tile 并行降低复杂度,软件可解 1080p) | 低(硬件支持全覆盖,软件可解 4K) | 中高(需硬件加速,软件解 4K 较吃力) |
硬件支持 | 一般(中高端芯片支持,低端依赖软件) | 中(2018 年后芯片支持,如骁龙 845、天玑 1000+) | 全覆盖(2010 年后芯片均支持) | 中高(2015 年后中高端芯片支持,低端缺失) |
参考帧数量 | 3 帧 | 8 帧 | 16 帧(High Profile) | 32 帧(Main 10 Profile) |
分块灵活性 | 低(16x16 宏块 + 对称子块) | 中(64x64 超级块 + 递归分块) | 中(16x16 宏块 + PU 分块) | 高(64x64 CTU+CU/PU/TU 灵活分块) |
色深 / 色域 | 8-bit BT.601 4:2:0 | 8/10/12-bit BT.601/BT.2020 4:2:0/4:2:2/4:4:4 | 8-bit BT.601/BT.709 4:2:0/4:2:2/4:4:4 | 8/10/12/14-bit BT.709/BT.2020 全采样 |
可伸缩编码(SVC) | 不支持 | 支持(空间 / 时间 / 质量) | 支持(需扩展 Profile,如 SVC Profile) | 支持(原生支持,如 SHVC) |
HDR 支持 | 不支持 | 支持(10/12-bit+BT.2020+PQ/HLG) | 不支持(需扩展,如 H.264 HDR,极少用) | 支持(原生支持,Main 10 Profile) |
主流应用场景 | WebRTC 低码率通话、低端设备视频 | YouTube、WebRTC 高清通话、开源 HDR 视频 | 直播(RTMP)、安防监控、移动端视频 | 4K/8K 电视、蓝光、专业视频制作、HDR 视频 |
二、关键差异深度解析
1. 授权模式:开源免费 vs 专利收费
- VP8/VP9:Google 通过收购 On2 Technologies 获得核心专利,并承诺 “永久开源免费”,无任何专利使用费,适合中小企业、开源项目(如 FFmpeg、WebRTC);
- H.264/H.265:由 MPEG LA、HEVC Advance 等多个专利联盟管理,需按 “设备数量” 或 “视频流量” 支付 royalties(如 H.265 每台设备约 0.2 美元,年营收超 1000 万美元企业需额外缴费),大型企业(如苹果、三星)可承受,但中小企业和开源项目成本较高。
2. 压缩效率:H.265 > VP9 > H.264 > VP8
- 相同画质下,码率对比(以 1080p 30fps 为例):
- H.265:1500-3000 kbps;
- VP9:1800-3500 kbps;
- H.264:3000-6000 kbps;
- VP8:3500-7000 kbps;
- 结论:H.265 压缩效率最高(适合带宽受限场景,如 4K 流媒体),VP9 次之(开源场景最优),H.264 兼容性最好(低码率场景仍不可替代),VP8 逐渐被 VP9 淘汰。
3. 硬件支持:H.264 > H.265 > VP9 > VP8
- H.264:硬件支持 “全覆盖”,从低端物联网设备(如 ESP32-CAM)到高端服务器均支持,软件解码也可轻松处理 4K;
- H.265:中高端设备支持(如 2015 年后的电视、2018 年后的手机),低端设备(如老年机、廉价摄像头)仍不支持,需依赖软件解码(复杂度高);
- VP9:2018 年后的中高端芯片支持(如骁龙 845、苹果 A12、华为麒麟 980),低端设备需软件解码(1080p 可实时,4K 较吃力);
- VP8:仅中高端设备硬件支持,低端设备软件解码(720p 可实时,1080p 较卡顿),逐渐被 VP9 替代。
4. 应用场景选择建议
- 选 H.264:需兼容低端设备(如安防监控、老年机)、直播场景(RTMP 协议主流编码)、低复杂度场景(嵌入式设备);
- 选 H.265:4K/8K 视频(如电视、蓝光)、HDR 内容、带宽受限场景(如 5G 移动流媒体),且企业可承担专利费;
- 选 VP9:开源项目(如 FFmpeg、WebRTC)、YouTube 等免费平台、需避免专利费的中小企业、HDR 视频(开源场景最优);
- 选 VP8:仅用于旧设备兼容(如 2015 年前的 WebRTC 设备),新项目优先 VP9。
三、未来趋势
- VP9 的延续:Google 已推出 VP9 的升级版 AV1(2018 年发布),压缩效率比 VP9 高 30%,比 H.265 高 10%,且开源免费,未来将逐步替代 VP9;
- H.265 的挑战:面临 AV1 的竞争,专利费复杂问题导致中小企业转向开源编码,但其硬件支持仍领先,短期内仍将在专业视频领域占据主导;
- H.264 的生命力:兼容性极强,短期内不会被淘汰,仍将是低码率、低端设备的主流选择。