视频编码:H.264、H.265、SVC 与 AV1
视频编码:H.264、H.265、SVC 与 AV1
视频编码是 RTC 中的核心环节,决定了视频的压缩效率、延迟和画质。本章将介绍主流视频编码标准的工作原理及其在 WebRTC 中的应用。
1. 视频编码基础
1.1 为什么需要视频编码
视频数据存在大量的冗余信息,编码的目的是去除这些冗余。
1.1.1 空间冗余(Spatial Redundancy)
定义:同一帧图像内,相邻像素之间的值往往非常接近。
原因:
- 自然图像中,相邻区域通常属于同一物体或背景
- 物体表面的颜色、亮度变化是渐进的,而非突变的
- 图像中存在大量平坦区域或纹理相似区域
示例:
一块蓝色天空区域的像素值:
┌─────┬─────┬─────┬─────┐
│ 120 │ 121 │ 120 │ 122 │ ← 相邻像素值非常接近
├─────┼─────┼─────┼─────┤
│ 119 │ 120 │ 121 │ 120 │
├─────┼─────┼─────┼─────┤
│ 121 │ 120 │ 119 │ 121 │
└─────┴─────┴─────┴─────┘
原始存储: 需要存储每个像素值 (16个数值)
压缩后: 可以用"基准值 + 预测误差"表示,误差值通常很小甚至为0
压缩方法:帧内预测(Intra Prediction)
- 利用已编码的相邻像素预测当前像素
- 只编码预测误差(残差)
- 残差的数值范围远小于原始像素值
1.1.2 时间冗余(Temporal Redundancy)
定义:视频序列中,连续帧之间的内容变化很小。
原因:
- 视频通常以 24-60fps 捕获,相邻帧间隔仅 16-42ms
- 在如此短的时间内,场景中的大部分内容保持不变
- 即使有运动,物体的形状、颜色、纹理通常不变,只是位置变化
示例:
帧 N (时间 t): 帧 N+1 (时间 t+33ms):
┌─────────────────┐ ┌─────────────────┐
│ 背景 │ │ 背景 │
│ ┌───┐ │ │ ┌───┐ │
│ │汽车│ 向右移动│ ──> │ │汽车│ │
│ └───┘ │ │ └───┘ │
└─────────────────┘ └─────────────────┘
只有汽车位置改变,背景完全相同
压缩方法:帧间预测(Inter Prediction)
- 在参考帧中搜索匹配块(运动估计)
- 记录运动矢量(位移)和残差
- 运动矢量 + 残差的数据量远小于完整帧
1.1.3 视觉冗余(Visual Redundancy)
定义:人眼视觉系统(HVS)对某些信息不敏感,可以丢弃而不影响主观感受。
人眼特性:
| 特性 | 说明 | 压缩利用 |
|---|---|---|
| 亮度敏感度高 | 对亮度变化更敏感 | 色度子采样(YUV420) |
| 高频敏感度低 | 对细节纹理不敏感 | 高频系数量化 |
| 运动掩蔽 | 运动区域容忍更多失真 | 运动区域降低精度 |
| 边缘敏感度高 | 对边缘特别敏感 | 保留边缘信息 |
频域量化原理:
DCT 变换后的系数分布:
低频区域: 高频区域:
┌────────┐ ┌────────┐
│ 大数值 │ 量化后 │ 小数值 │ 量化后
│ 重要 │ ────> │ 不重要 │ ────> 大量变为0
└────────┘ └────────┘
人眼对高频细节(如细微纹理)不敏感
可以大幅度量化甚至丢弃
压缩方法:量化(Quantization)
- 将连续值映射到有限的离散级别
- 高频系数量化步长大,更多系数变为零
- 零系数无需编码,大幅减少数据量
1.1.4 编码冗余(Coding Redundancy)
定义:不同符号出现的概率不同,但使用固定长度编码。
原因:
- 预测残差的分布不均匀:小残差出现概率高,大残差出现概率低
- 运动矢量的分布不均匀:零矢量和附近矢量出现概率高
- 量化后的系数:零值占大多数
示例:
残差值的概率分布:
残差值 出现次数 固定编码 变长编码
0 10000 8 bits 1 bit (短码给高频符号)
+1 5000 8 bits 2 bits
-1 5000 8 bits 2 bits
+2 2000 8 bits 3 bits
-2 2000 8 bits 3 bits
...
±100 5 8 bits 12 bits (长码给低频符号)
固定编码总长: 24000 × 8 = 192000 bits
变长编码总长: 10000×1 + 10000×2 + 4000×3 + ... ≈ 50000 bits
压缩方法:熵编码(Entropy Coding)
- Huffman 编码:根据概率分配变长码
- 算术编码:更高效的概率编码
- CABAC(H.264/265):上下文自适应二进制算术编码
1.1.5 冗余去除流程
flowchart TB
A[原始视频帧] --> B[去除空间冗余<br>帧内预测]
B --> C[去除时间冗余<br>帧间预测]
C --> D[去除视觉冗余<br>量化]
D --> E[去除编码冗余<br>熵编码]
E --> F[压缩码流]
G[原始数据量 100%] --> H[预测后 ~30%]
H --> I[量化后 ~10%]
I --> J[熵编码后 ~2-5%]
| 冗余类型 | 说明 | 压缩方法 | 典型压缩比 |
|---|---|---|---|
| 空间冗余 | 同一帧内相邻像素相似 | 帧内预测 | 2-5:1 |
| 时间冗余 | 相邻帧之间内容相似 | 帧间预测 | 5-20:1 |
| 视觉冗余 | 人眼对某些信息不敏感 | 量化 | 5-10:1 |
| 编码冗余 | 符号出现概率不均 | 熵编码 | 1.5-3:1 |
数据量对比:
| 格式 | 1080p@30fps 码率 | 压缩比 |
|---|---|---|
| 未压缩 RGB | ~1.5 Gbps | 1:1 |
| 未压缩 YUV420 | ~750 Mbps | 2:1 |
| H.264 编码 | 2-8 Mbps | 100:1~400:1 |
| H.265 编码 | 1-4 Mbps | 200:1~800:1 |
1.2 帧类型
| 帧类型 | 全称 | 编码方式 | 大小占比 |
|---|---|---|---|
| I 帧 | Intra Frame | 独立编码,不参考其他帧 | 100% |
| P 帧 | Predicted Frame | 参考前面的帧 | ~50% |
| B 帧 | Bi-directional Frame | 参考前后的帧 | ~25% |
flowchart LR
I1[I帧] --> P1[P帧]
P1 --> P2[P帧]
P2 --> B1[B帧]
B1 --> I2[I帧]
I2 --> P3[P帧]
I1 -.-> |参考| P1
P1 -.-> |参考| P2
I1 -.-> |前向参考| B1
I2 -.-> |后向参考| B1
实时通信中的帧类型选择:
- WebRTC 通常只使用 I 帧和 P 帧
- B 帧需要等待后续帧,增加延迟
- 低延迟场景避免使用 B 帧
1.3 GOP(Group of Pictures)
GOP 是两个 I 帧之间的帧序列:
GOP 结构示例: I P P P B B P P P B B I
|-------- GOP --------|
GOP Size = 12 (两个 I 帧之间的帧数)
GOP Interval = Size / FrameRate = 12/30 = 0.4秒
| GOP 大小 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 小(0.5-1秒) | 快速错误恢复,Seek 快 | I 帧频繁,带宽波动大,压缩效率低 | 点播/录像 |
| 中(1-2秒) | 平衡 | - | 直播 |
| 大(2-10秒+) | 压缩效率高,带宽稳定 | 错误恢复依赖重传/请求关键帧 | 实时通信 |
实时通信的 GOP 策略:
- 大 GOP(长关键帧间隔):减少 I 帧频率,避免带宽突发
- 按需请求关键帧:通过 PLI(Picture Loss Indication)在解码失败时请求
- 错误恢复机制:依赖 NACK 重传 + FEC,而非频繁关键帧
1.4 编码流程
flowchart TB
A[原始帧] --> B[预测]
subgraph 预测
B1[帧内预测]
B2[帧间预测/运动估计]
end
B --> C[残差]
C --> D[变换 DCT]
D --> E[量化]
E --> F[熵编码]
F --> G[编码流]
subgraph 环路处理
H[反量化]
I[反变换]
J[重建帧]
K[去块滤波]
end
E --> H
H --> I
I --> J
J --> K
K --> L[参考帧缓存]
L --> B2
各阶段作用:
| 阶段 | 作用 |
|---|---|
| 帧内预测 | 利用帧内空间相关性 |
| 帧间预测 | 利用帧间时间相关性 |
| 变换 | 将空域信号转换到频域 |
| 量化 | 降低精度,丢弃视觉冗余 |
| 熵编码 | 无损压缩符号序列 |
| 环路滤波 | 消除块效应,提升主观质量 |
1.5 运动估计与运动补偿
运动估计是视频编码的核心技术:
flowchart LR
subgraph 当前帧
A[待编码块]
end
subgraph 参考帧
B[搜索窗口]
C[最佳匹配块]
end
A --> |搜索| B
B --> |找到| C
C --> |运动矢量| D[残差编码]
- 运动矢量(MV):描述块在参考帧中的位移
- 残差:当前块与预测块的差值
- 搜索范围:决定编码复杂度和压缩效率
1.6 变换编码
DCT(离散余弦变换)将图像块转换到频域:
原始块 (8×8) DCT 系数 (8×8)
┌────────┐ ┌────────┐
│图像像素│ ──DCT──> │低频→高频│
└────────┘ └────────┘
│
量化后
↓
大多数高频系数为0
为什么使用 DCT:
- 能量集中在低频系数
- 量化后大量高频系数为零
- 便于熵编码压缩
2. H.264/AVC
2.1 概述
H.264 由 ITU-T 和 ISO/IEC 联合制定,是目前最广泛使用的视频编码标准。
| 特性 | 说明 |
|---|---|
| 发布时间 | 2003 年 |
| 标准名称 | AVC(Advanced Video Coding) |
| 压缩效率 | 比 H.263 提升约 50% |
| 应用范围 | 视频会议、直播、流媒体、存储 |
2.2 H.264 关键技术
宏块结构
H.264 以 16×16 像素的宏块为基本编码单元:
宏块 (16×16)
┌──────────────────────┐
│ 可分割为: │
│ - 16×16 │
│ - 16×8, 8×16 │
│ - 8×8, 8×4, 4×8, 4×4 │
│ - 4×4 (最小) │
└──────────────────────┘
灵活的分割方式适应不同纹理复杂度的区域。
帧内预测
H.264 支持 9 种 4×4 块的帧内预测模式:
预测方向:
│ ↗ ╱
│ ╱ ╱
──┼── ╱
╱│ ╱ ↗
╱ │╱
帧间预测
- 支持多参考帧
- 1/4 像素精度运动估计
- B 帧的直接预测模式
环路滤波
去块滤波(Deblocking Filter)消除块效应:
滤波前: 滤波后:
┌───┬───┐ ┌───────┐
│ A │ B │ 边界 │ 平滑 │
├───┼───┤ ────> │ 过渡 │
│ C │ D │ │ │
└───┴───┘ └───────┘
2.3 Profile(档次)
Profile 定义编码工具集:
| Profile | 特性支持 | 典型应用 |
|---|---|---|
| Baseline | I/P 帧、CAVLC | 移动设备、视频通话 |
| Constrained Baseline | Baseline 子集 | WebRTC 推荐 |
| Main | +B 帧、CABAC | 广播电视、存储 |
| High | +8×8 变换、量化矩阵 | 高清视频、蓝光 |
WebRTC 选择 Constrained Baseline 的原因:
- 无 B 帧,低延迟
- 无 CABAC,解码简单
- 广泛的硬件支持
2.4 Level(等级)
Level 定义解码能力上限:
| Level | 最大分辨率 | 最大帧率 | 最大码率 | 典型应用 |
|---|---|---|---|---|
| 3.0 | 720p | 30fps | 10 Mbps | 移动设备 |
| 3.1 | 720p | 30fps | 14 Mbps | 高端手机 |
| 4.0 | 1080p | 30fps | 20 Mbps | 桌面/笔记本 |
| 4.1 | 1080p | 30fps | 50 Mbps | 高性能设备 |
| 5.0 | 4K | 30fps | 135 Mbps | 专业设备 |
2.5 H.264 NAL 单元
H.264 码流由 NAL(Network Abstraction Layer)单元组成:
NAL 单元结构:
┌──────────┬─────────────────┐
│ NAL Header│ RBSP Payload │
│ (1字节) │ (变长) │
└──────────┴─────────────────┘
NAL Header:
|0|1|2|3|4|5|6|7|
|F|NRI| Type |
F: 禁止位
NRI: 重要性标识
Type: NAL 单元类型
常用 NAL 类型:
| Type | 名称 | 说明 |
|---|---|---|
| 1 | 非 IDR 切片 | P/B 帧数据 |
| 5 | IDR 切片 | I 帧(关键帧) |
| 7 | SPS | 序列参数集 |
| 8 | PPS | 图像参数集 |
2.6 SDP 参数
H.264 在 SDP 中的协商参数:
a=rtpmap:102 H264/90000
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
| 参数 | 说明 |
|---|---|
| profile-level-id | Profile 和 Level 标识(6位十六进制) |
| packetization-mode | 打包模式:0=单NAL,1=非交错,2=交错 |
| level-asymmetry-allowed | 是否允许编解码端使用不同 Level |
profile-level-id 解读:
42e01f = 0x42 0xe0 0x1f
│ │ └─ Level ID = 31 (Level 3.1)
│ └─ 约束标志
└─ Profile ID = 66 (Baseline)
3. H.265/HEVC
3.1 概述
H.265 是 H.264 的继任者,针对高清和超高清视频优化。
| 特性 | 说明 |
|---|---|
| 发布时间 | 2013 年 |
| 标准名称 | HEVC(High Efficiency Video Coding) |
| 压缩效率 | 比 H.264 提升约 50% |
| 目标应用 | 4K/8K 视频 |
3.2 H.265 关键技术
CTU(编码树单元)
H.265 使用 CTU 替代宏块:
H.264 宏块: H.265 CTU:
┌────────┐ ┌────────────────────────┐
│ 16×16 │ │ 64×64 │
│ 固定大小│ │ 可递归分割至 4×4 │
└────────┘ │ 四叉树结构 │
└────────────────────────┘
CTU 的优势:
- 大块更好地压缩大面积纹理
- 递归分割适应局部复杂度
- 减少运动矢量的比特开销
更多预测方向
| 特性 | H.264 | H.265 |
|---|---|---|
| 帧内预测方向 | 9 种 | 35 种 |
| 运动矢量精度 | 1/4 像素 | 1/4 像素 |
| 参考帧数量 | 最多 16 | 最多 16 |
并行编码工具
H.265 引入了多种并行编码机制:
| 工具 | 说明 |
|---|---|
| Tile | 将图像划分为矩形区域独立编码 |
| WPP(Wavefront Parallel Processing) | 波前并行处理 |
| Slice | 分片编码 |
3.3 H.264 vs H.265 对比
| 特性 | H.264 | H.265 |
|---|---|---|
| 编码单元 | 16×16 宏块 | 64×64 CTU |
| 帧内预测方向 | 9 种 | 35 种 |
| 帧间预测 | 矩形分割 | 四叉树分割 |
| 环路滤波 | 去块滤波 | 去块 + SAO |
| 压缩效率 | 基准 | +50% |
| 编码复杂度 | 基准 | +3-5x |
| 解码复杂度 | 基准 | +2x |
| 硬件支持 | 广泛 | 较少 |
| 专利费 | 有 | 有 |
3.4 H.265 在 WebRTC 中的挑战
| 挑战 | 说明 |
|---|---|
| 浏览器支持 | Safari 部分支持,Chrome/Firefox 有限 |
| 硬件要求 | 需要较新的硬件解码器 |
| 编码延迟 | 编码复杂度高,实时性受影响 |
| 专利问题 | 专利池复杂,授权费用不确定 |
4. VP8/VP9
4.1 VP8
VP8 是 Google 收购 On2 Technologies 后开源的编码标准。
| 特性 | 说明 |
|---|---|
| 来源 | On2 Technologies(后被 Google 收购) |
| 授权 | 免版税(BSD 许可) |
| 压缩效率 | 与 H.264 Baseline 相当 |
| WebRTC 支持 | 所有主流浏览器 |
VP8 特点:
- 基于块的预测编码
- 4×4 和 16×16 块大小
- 帧内和帧间预测
- 简化的熵编码
4.2 VP9
VP9 是 VP8 的继任者,显著提升了压缩效率。
| 特性 | 说明 |
|---|---|
| 发布时间 | 2013 年 |
| 压缩效率 | 比 VP8 提升约 50% |
| SVC 支持 | 原生支持 |
| 授权 | 免版税 |
4.3 VP9 关键特性
Superblock 结构
VP9 使用 64×64 的 superblock:
Superblock (64×64):
┌────────────────────────┐
│ 可分割为: │
│ - 64×64, 64×32, 32×64 │
│ - 32×32, 32×16, 16×32 │
│ - 16×16, 16×8, 8×16 │
│ - 8×8, 8×4, 4×8, 4×4 │
└────────────────────────┘
高级预测模式
- 10 种帧内预测模式
- 复合预测(多个参考帧组合)
- 高精度运动矢量(1/8 像素)
环路滤波
- 简化的去块滤波
- 可配置的滤波强度
4.4 VP8/VP9 vs H.264/H.265
| 特性 | VP8 | VP9 | H.264 | H.265 |
|---|---|---|---|---|
| 授权 | 免费 | 免费 | 付费 | 付费 |
| 压缩效率 | 基准 | +50% | 基准 | +50% |
| SVC 支持 | 无 | 有 | 扩展 | 扩展 |
| 浏览器支持 | 广泛 | 良好 | 广泛 | 有限 |
| 硬件支持 | 一般 | 一般 | 广泛 | 较少 |
5. SVC(Scalable Video Coding)
SVC(可伸缩视频编码)将视频编码为多层结构,接收端可根据网络条件选择解码层数,实现带宽自适应和平滑降级。
5.1 SVC 概述
传统编码产生单一质量的码流,当网络带宽变化时需要切换到完全不同的流。SVC 则将视频编码为多层结构:
- 基础层(Base Layer):最低质量的视频,可独立解码
- 增强层(Enhancement Layers):在基础层之上逐步提升质量
flowchart TB
subgraph 发送端
A[原始视频] --> B[SVC 编码器]
B --> C[多层码流]
end
subgraph 网络传输
C --> D{网络条件}
end
subgraph 接收端
D -->|好| E[解码全部层<br>高清]
D -->|中| F[解码部分层<br>标清]
D -->|差| G[只解码基础层<br>流畅]
end
5.2 SVC 的价值
| 场景 | 传统编码 | SVC |
|---|---|---|
| 网络波动 | 码率骤降,画质跳变 | 平滑降级,无跳变 |
| 多人会议 | 每人发多路流(Simulcast) | 单路流,按需转发 |
| 录制 | 固定质量 | 按需选择任意质量 |
| 带宽利用率 | 需要冗余发送 | 按需传输 |
5.3 各编码标准的 SVC 支持
| 编码标准 | SVC 支持 | 说明 |
|---|---|---|
| H.264 | 有(SVC 扩展) | H.264-SVC,空间/时间/质量可伸缩 |
| H.265 | 有(SHVC) | 可伸缩 HEVC 扩展 |
| VP9 | 原生支持 | 内置 SVC,广泛用于 WebRTC |
| AV1 | 原生支持 | 内置可伸缩编码 |
详细内容请参阅:2.14 SVC 可伸缩视频编码,包含空间可伸缩、时间可伸缩、质量可伸缩三种模式的详细介绍,以及在 WebRTC 中的实际应用。
6. AV1
6.1 概述
AV1 由开放媒体联盟(AOM)开发,是新一代免版税编码标准。
| 特性 | 说明 |
|---|---|
| 发布时间 | 2018 年 |
| 开发组织 | AOM(Google、Mozilla、Netflix、Amazon 等) |
| 授权 | 免版税 |
| 目标 | 替代 VP9,与 H.265 竞争 |
6.2 AV1 关键技术
Superblock 结构
AV1 使用最大 128×128 的 superblock:
Superblock 大小:
- 128×128 (最大)
- 64×64
- 递归四叉树分割
帧内预测
- 56 种帧内预测模式
- 方向预测 + 平面预测 + DC 预测
高级帧间预测
- OBMC(Overlapped Block Motion Compensation)
- 复合预测(最多 4 个参考帧)
- 全局运动补偿
环路滤波
| 滤波器 | 作用 |
|---|---|
| 去块滤波 | 消除块边界伪影 |
| CDEF(Constrained Directional Enhancement Filter) | 方向性增强滤波 |
| Loop Restoration | 自适应环路恢复 |
| Film Grain Synthesis | 电影胶片颗粒合成 |
6.3 AV1 vs 其他编码
| 特性 | H.264 | H.265 | VP9 | AV1 |
|---|---|---|---|---|
| 发布年份 | 2003 | 2013 | 2013 | 2018 |
| 压缩效率 | 基准 | +50% | +50% | +30%(vs VP9) |
| 编码速度 | 快 | 慢 | 中等 | 很慢 |
| 解码复杂度 | 低 | 中 | 中 | 高 |
| 专利费 | 有 | 有 | 无 | 无 |
| 浏览器支持 | 广泛 | 有限 | 良好 | 增长中 |
| 硬件支持 | 广泛 | 较少 | 一般 | 较少 |
6.4 AV1 编码速度优化
AV1 编码慢的原因:
- 更复杂的预测模式
- 更大的搜索空间
- 多级环路滤波
优化方向:
- 实时编码模式(牺牲少量质量)
- 硬件编码器支持
- 多线程并行编码
7. 编码器选择策略
7.1 选择因素
flowchart TB
A[选择编码器] --> B{平台兼容性}
B -->|必须兼容所有平台| C{SVC 需求}
B -->|可接受部分兼容| D{性能要求}
C -->|需要| C1[H.264 SVC / VP9 SVC]
C -->|不需要| C2[H.264 基础]
D -->|高压缩效率| E{专利考虑}
D -->|低延迟优先| C2
E -->|可接受专利费| F{SVC 需求}
E -->|需要免版税| G[VP9/AV1]
F -->|需要| F1[H.265 SVC]
F -->|不需要| F2[H.265]
各编码的 SVC 支持情况:
| 编码标准 | SVC 支持 | 说明 |
|---|---|---|
| H.264 | 有(SVC 扩展) | H.264-SVC,空间/时间/质量可伸缩 |
| H.265 | 有(SHVC) | 可伸缩 HEVC 扩展 |
| VP9 | 原生支持 | 内置 SVC,广泛用于 WebRTC |
| AV1 | 原生支持 | 内置可伸缩编码 |
WebRTC 中 SVC 的实际使用:
- VP9 SVC:最广泛使用,浏览器支持最好
- H.264 SVC:部分硬件支持,使用较少
- H.265 SVC:浏览器支持有限
7.2 场景推荐
| 场景 | 推荐编码 | 理由 |
|---|---|---|
| 1v1 通话 | H.264/VP8 | 兼容性最好,延迟低 |
| 多人会议 | VP9 SVC / H.264 SVC | 带宽自适应,单流多质量 |
| 高清直播 | H.265 | 压缩效率高 |
| Web 广泛兼容 | H.264 | 最广泛支持 |
| 新平台/免版税 | AV1 / VP9 | 未来趋势,免版税 |
| 移动端低功耗 | H.264 + 硬编 | 硬件支持广泛 |
7.3 编码参数权衡
| 参数 | 增大 | 减小 |
|---|---|---|
| 码率 | 画质提升,带宽增加 | 画质下降,带宽节省 |
| 帧率 | 流畅度提升,CPU 增加 | 流畅度下降,CPU 节省 |
| 分辨率 | 清晰度提升,数据量增加 | 清晰度下降,数据量减少 |
| GOP 大小 | 压缩效率提升 | 错误恢复加快 |
| 编码复杂度 | 画质提升,速度下降 | 画质下降,速度提升 |
8. 硬件编码 vs 软件编码
8.1 对比
| 特性 | 硬件编码 | 软件编码 |
|---|---|---|
| CPU 占用 | 极低 | 高 |
| 延迟 | 较低 | 较高 |
| 画质 | 中等 | 高(可调) |
| 灵活性 | 受限于硬件 | 完全可控 |
| 功耗 | 低 | 高 |
| 成本 | 需要专用硬件 | 无额外成本 |
| 升级 | 需换硬件 | 软件更新 |
8.2 各平台硬件编码支持
| 平台 | 编码 API | 支持的编码格式 |
|---|---|---|
| Windows | Media Foundation | H.264, H.265 |
| Windows | NVENC(NVIDIA) | H.264, H.265, AV1 |
| Windows | QuickSync(Intel) | H.264, H.265, VP9, AV1 |
| macOS | VideoToolbox | H.264, H.265 |
| iOS | VideoToolbox | H.264, H.265 |
| Android | MediaCodec | H.264, H.265, VP8, VP9 |
| Linux | VAAPI | H.264, H.265, VP9 |
| Linux | NVENC | H.264, H.265, AV1 |
8.3 硬件编码的局限
| 局限 | 说明 |
|---|---|
| 固定功能 | 只支持特定编码格式和参数范围 |
| 画质损失 | 通常比软件编码画质稍差 |
| 驱动依赖 | 需要正确的驱动程序 |
| 并发限制 | 同时编码路数受限 |
9. 码率控制
9.1 码率控制模式
| 模式 | 全称 | 特点 | 适用场景 |
|---|---|---|---|
| CBR | Constant Bitrate | 码率恒定,质量波动 | 直播推流 |
| VBR | Variable Bitrate | 质量恒定,码率波动 | 录制存储 |
| CQP | Constant QP | 量化参数恒定 | 质量分析 |
| ABR | Adaptive Bitrate | 根据网络自适应 | RTC 推荐 |
9.2 自适应码率(ABR)
WebRTC 中的 ABR 机制:
flowchart TB
A[带宽估计 BWE] --> B{可用带宽}
B --> C[目标码率计算]
C --> D[编码器调整]
subgraph 调整策略
D --> E[调整量化参数]
D --> F[调整分辨率]
D --> G[调整帧率]
end
E --> H[输出码流]
F --> H
G --> H
H --> I[网络传输]
I --> J[接收端反馈]
J --> A
9.3 码率分配策略
| 策略 | 说明 |
|---|---|
| 优先帧率 | 保持流畅,牺牲分辨率 |
| 优先分辨率 | 保持清晰,牺牲帧率 |
| 平衡模式 | 动态调整帧率和分辨率 |
| 内容自适应 | 根据场景复杂度分配 |
9.4 码率与质量的关系
质量
│
│ ┌───────────
│ ╱
│ ╱
│ ╱
│ ╱
│╱
└─────────────────────── 码率
低 中 高
- 低码率区间:码率增加,质量显著提升
- 中码率区间:提升放缓
- 高码率区间:边际效应递减
10. 总结
10.1 编码标准对比
| 编码标准 | 压缩效率 | 实时性 | 兼容性 | 专利 | 推荐场景 |
|---|---|---|---|---|---|
| H.264 | 基准 | 优秀 | 最广 | 有 | 通用 RTC |
| H.265 | +50% | 良好 | 有限 | 有 | 高清/4K |
| VP8 | 基准 | 优秀 | 广泛 | 无 | 兼容免版税 |
| VP9 | +50% | 良好 | 良好 | 无 | 多人会议/SVC |
| AV1 | +30%(vs VP9) | 一般 | 增长中 | 无 | 未来趋势 |
10.2 关键点
- H.264:兼容性最好,WebRTC 默认支持,适合通用场景
- H.265:压缩效率高,但浏览器支持有限,专利问题复杂
- VP9:免版税,原生 SVC 支持,适合多人会议
- AV1:新一代免版税标准,压缩效率最高,编码速度待优化
- SVC:动态适应网络,平滑降级,适合带宽波动场景
- 硬件编码:低 CPU 占用,适合移动端和多路并发
- 自适应码率:实时通信必备,根据网络动态调整
下一章将介绍音频编码技术。
