视频编码: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 关键点

  1. H.264:兼容性最好,WebRTC 默认支持,适合通用场景
  2. H.265:压缩效率高,但浏览器支持有限,专利问题复杂
  3. VP9:免版税,原生 SVC 支持,适合多人会议
  4. AV1:新一代免版税标准,压缩效率最高,编码速度待优化
  5. SVC:动态适应网络,平滑降级,适合带宽波动场景
  6. 硬件编码:低 CPU 占用,适合移动端和多路并发
  7. 自适应码率:实时通信必备,根据网络动态调整

下一章将介绍音频编码技术。