【音视频】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 思路相似,核心是通过 "预测 - 变换 - 量化 - 熵编码" 消除视频冗余,

具体步骤如下

  1. 帧分块 :将每帧划分为固定大小的16x16 宏块(Macroblock),宏块可进一步拆分为 4x4、8x8 子块;

  2. 预测模式选择:对每个块选择 "帧内预测" 或 "帧间预测":

    • 帧内预测(Intra):利用当前帧已解码的邻近像素(如水平、垂直方向)预测当前块值,支持 DC 预测、水平预测等基础模式;
    • 帧间预测(Inter):利用前一帧(Last 帧)、参考帧(Golden/AltRef 帧,最多 3 个参考帧)的块进行预测,支持1/4 像素精度的运动估计;
  3. 残差计算与变换 :计算 "预测值" 与 "原始值" 的差值(残差),对残差使用4x4 或 16x16 DCT(离散余弦变换) 转换为频域系数;

  4. 量化:对频域系数进行量化(降低精度),通过调整量化参数(QP)平衡 "码率" 与 "画质"(QP 越大,压缩越强、画质越差);

  5. 熵编码 :使用轻量级 Bool 编码器(Boolean Arithmetic Coding) 对量化后的系数和预测模式等语法元素进行压缩,输出最终比特流。

三、VP8 帧结构

VP8 的每一帧(Frame)由 "帧头" 和 "帧数据" 两部分组成,帧头区分 "关键帧" 和 "非关键帧",结构如下:

1. 共通帧头(Frame Tag,3 字节)
text 复制代码
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字节:

text 复制代码
0x9D 0x01 0x2A  // Start code (固定标志)
2 字节: 宽度 + flags
2 字节: 高度 + flags
  • 固定起始码(3 字节):0x9D 0x01 0x2A(用于解码器识别关键帧);
  • 宽度 + 标志(2 字节):存储图像宽度(需按 16 像素对齐)及颜色空间标志;
  • 高度 + 标志(2 字节):存储图像高度(需按 16 像素对齐)及颜色空间标志。
3. 帧数据(Frame Partitions)

帧数据拆分为多个分区(Partition 0~N),分工明确:

text 复制代码
[ Partition 0 ] [ Partition 1 ] [ Partition 2 ] ... [ Partition N ]
  • Partition 0:存储控制信息(预测模式、宏块类型、参考帧索引等),需完整接收才能解码后续分区;
  • Partition 1~N:存储宏块残差的频域系数(实际视频数据),可并行解码。
VP8 帧结构简化图示
text 复制代码
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 核心技术特点

  1. 宏块与分块:固定 16x16 宏块,支持 4x4/8x8 子块,每个宏块最多 4 个运动矢量;
  2. 参考帧:最多支持 3 个参考帧(Last:最近帧、Golden:高质量参考帧、AltRef:备用参考帧);
  3. 熵编码:采用轻量级 Bool 编码,比 H.264 的 CAVLC 更高效,但复杂度低于 CABAC;
  4. 去块滤波:内置环路去块滤波器,消除宏块边界伪影(Blocking Artifacts);
  5. 局限性:不支持 B 帧、不支持可伸缩编码(SVC)、仅支持 8-bit YUV 4:2:0 色深(无法满足 HDR 需求)。
1. 编码命令(vpxenc)

将 Y4M 格式视频编码为 VP8(WebM 封装):

bash 复制代码
# 基础编码:比特率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 原始格式:

bash 复制代码
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 帧结构简化图示
plaintext 复制代码
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 封装):

bash 复制代码
# 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:

bash 复制代码
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 的生命力:兼容性极强,短期内不会被淘汰,仍将是低码率、低端设备的主流选择。
相关推荐
水印云5 小时前
视频转文字软件哪个免费好用?2025年5款实用工具实测,助力办公效率!
音视频
千里马学框架6 小时前
安卓15 audio新专题发布:安卓系统手机车机音频audio子系统深入实战开发专题
android·智能手机·音视频
余(18538162800)8 小时前
手机版碰一碰发视频源码搭建,技术实现与实操指南
智能手机·音视频
AirDroid_cn11 小时前
苹果手机文本转音频,自行制作背诵素材
智能手机·音视频
Antonio91512 小时前
【音视频】火山引擎实时、低延时拥塞控制算法的优化实践
音视频·火山引擎
A尘埃19 小时前
FFmpeg音视频处理解决方案
ffmpeg·音视频
AidLux20 小时前
犀牛派A1上使用Faster Whisper完成音频转文字
人工智能·语言模型·whisper·音视频
Font Tian1 天前
FFmpeg 不同编码的压缩命令详解
ffmpeg·音视频·视频编解码·视频·视频压缩
Natsume17101 天前
音视频开发入门:FFmpeg vs GStreamer,新手该如何选择?
c语言·c++·ffmpeg·音视频·webrtc·实时音视频·视频编解码