SVC 可伸缩视频编码
SVC 可伸缩视频编码
SVC(Scalable Video Coding)是一种将视频编码为多层结构的技术,允许接收端根据网络条件和终端能力选择解码不同的层。本章将详细介绍 SVC 的三种可伸缩模式及其在 WebRTC 中的应用。
1. SVC 概述
1.1 什么是 SVC
传统视频编码产生单层码流,要么完整解码要么无法解码。SVC 将视频编码为分层结构:
flowchart TB
subgraph SVC 码流
A[基础层 BL<br>必须解码]
B[增强层 1 EL1<br>可选]
C[增强层 2 EL2<br>可选]
end
A --> D[最低质量]
A --> B --> E[中等质量]
A --> B --> C --> F[最高质量]
G[带宽不足时] --> |只接收基础层| A
H[带宽充足时] --> |接收所有层| C
1.2 SVC 的核心价值
| 场景 | 传统编码的问题 | SVC 的解决方案 |
|---|---|---|
| 网络波动 | 码率骤降时画质跳变 | 平滑降级,逐步丢弃增强层 |
| 多人会议 | 每人需要多路不同质量流 | 单路流,SFU 按需转发不同层 |
| 异构终端 | 高性能设备受限低分辨率 | 各终端按能力选择解码层数 |
| 录制回放 | 固定质量无法适配 | 可选择任意质量层级 |
1.3 SVC 与 Simulcast 对比
flowchart TB
subgraph Simulcast
A1[编码器] --> B1[高清流 1080p]
A1 --> C1[标清流 720p]
A1 --> D1[流畅流 360p]
B1 --> E1[3x 带宽]
C1 --> E1
D1 --> E1
end
subgraph SVC
A2[编码器] --> B2[基础层 360p]
B2 --> C2[增强层 720p]
C2 --> D2[增强层 1080p]
B2 --> E2[1.2-1.5x 带宽]
C2 --> E2
D2 --> E2
end
| 特性 | Simulcast | SVC |
|---|---|---|
| 编码方式 | 多次独立编码 | 一次分层编码 |
| 码流大小 | 大(完全独立流) | 小(共享基础层) |
| 编码复杂度 | 较低 | 较高 |
| 灵活性 | 固定几种质量 | 可任意组合层 |
| 兼容性 | 广泛支持 | 需编码器支持 |
| 上行带宽 | 3x(发3路) | 1.2-1.5x |
2. 空间可伸缩(Spatial Scalability)
2.1 原理
空间可伸缩性提供不同分辨率的视频层:
空间层结构:
┌─────────────────────────────────┐
│ 增强层 2 (S2): 1080p │
│ ┌─────────────────────────┐ │
│ │ 增强层 1 (S1): 720p │ │
│ │ ┌─────────────────┐ │ │
│ │ │ 基础层 (S0):360p │ │ │
│ │ │ │ │ │
│ │ │ 640 × 360 │ │ │
│ │ └─────────────────┘ │ │
│ │ 1280 × 720 │ │
│ └─────────────────────────┘ │
│ 1920 × 1080 │
└─────────────────────────────────┘
S0 可独立解码
S1 需要 S0 才能解码
S2 需要 S0 + S1 才能解码
2.2 空间层编码过程
flowchart TB
A[原始帧 1080p] --> B[下采样]
B --> C[720p 帧]
C --> D[下采样]
D --> E[360p 帧]
E --> F[编码基础层 S0]
F --> G[重建 360p]
G --> H[上采样到 720p]
C --> I[与上采样结果求差]
H --> I
I --> J[编码增强层 S1]
J --> K[重建 720p]
K --> L[上采样到 1080p]
A --> M[与上采样结果求差]
L --> M
M --> N[编码增强层 S2]
2.3 空间层依赖关系
依赖关系图:
1080p 输出 ──┬── S2 增强层
│
720p 输出 ──┼── S1 增强层
│ │
360p 输出 ──┴──── S0 基础层(独立可解码)
解码 1080p 需要: S0 + S1 + S2
解码 720p 需要: S0 + S1
解码 360p 需要: S0
2.4 空间层参数
| 参数 | 说明 |
|---|---|
| 层数 | 通常 2-3 层 |
| 分辨率比 | 通常 2 倍关系(360p → 720p → 1080p) |
| 码率分配 | 基础层约占 30-40%,增强层 60-70% |
3. 时间可伸缩(Temporal Scalability)
3.1 原理
时间可伸缩性提供不同帧率的视频层:
时间层结构 (30fps 源视频):
帧序列:
T0: I ───────────────── I ───────────────── I
│ │ │
T1: ├──── P ─────────────┼──── P ─────────────┤
│ │ │ │ │
T2: ├────┼──── P ────────┼────┼──── P ────────┤
│ │ │ │ │ │ │
0 1 2 3 4 5 6 7 8 (帧号)
T0 (基础层): I 帧,7.5fps (每 4 帧一个)
T1 (增强层): P 帧,15fps (每 2 帧一个)
T2 (增强层): P 帧,30fps (全部帧)
3.2 帧依赖图
时间层依赖关系 (T2 最高,T0 最低):
T2 P ─── P ─── P ─── P ─── P ─── P ─── P ─── P
│ │\ │\ │\ │\ │\ │\ │
T1 └─P ──┘ P ──┘│── P ──┘│── P ──┘│── P ──┘
│\ │\ │\ │
T0 I ────┘──────┘──────┘──────┘────── I
│ │
└──────────────────────────────┘
箭头表示参考关系:
- T2 帧可参考 T1 或 T0 帧
- T1 帧可参考 T0 帧
- T0 帧只参考其他 T0 帧(I 帧)
丢弃 T2 帧不影响 T0/T1 解码
丢弃 T1 帧不影响 T0 解码
3.3 时间层编码配置
| 时间层数 | 帧率分布 | 适用场景 |
|---|---|---|
| 2 层 | 15fps + 30fps | 简单自适应 |
| 3 层 | 7.5fps + 15fps + 30fps | 标准配置 |
| 4 层 | 3.75fps + 7.5fps + 15fps + 30fps | 高度自适应 |
3.4 时间层码率分配
典型 3 层时间 SVC 码率分配 (总码率 2Mbps):
┌─────────────────────────────────────┐
│ T2 (30fps): ~1.2 Mbps (60%) │
├─────────────────────────────────────┤
│ T1 (15fps): ~0.5 Mbps (25%) │
├─────────────────────────────────────┤
│ T0 (7.5fps): ~0.3 Mbps (15%) │
└─────────────────────────────────────┘
丢弃 T2 后码率: 0.8 Mbps (40%)
丢弃 T1+T2 后码率: 0.3 Mbps (15%)
4. 质量可伸缩(Quality/SNR Scalability)
4.1 原理
质量可伸缩性提供相同分辨率下不同质量的视频层:
质量层结构:
高质量 (Q2): 高码率,低量化
↑ 增强层
─────────────────────────
中等质量 (Q1): 中码率
↑ 增强层
─────────────────────────
基础质量 (Q0): 低码率,高量化
基础层
所有层分辨率相同,但质量(SNR)不同
4.2 质量层编码方式
粗粒度质量可伸缩(CGS):
CGS 编码:
原始帧 → 基础层编码 (QP=40) → 基础层码流
↓
残差 → 增强层编码 (QP=30) → 增强层码流
↓
残差 → 增强层编码 (QP=20) → 增强层码流
每一层使用不同的 QP 值
中等粒度质量可伸缩(MGS):
MGS 编码:
将 DCT 系数分组:
┌────────────────────────┐
│ 低频系数 │ 中频系数 │ 高频系数 │
│ 基础层 │ 增强层1 │ 增强层2 │
└────────────────────────┘
可以按系数组为单位丢弃增强层
提供更细粒度的质量控制
4.3 质量层 vs 空间层
| 特性 | 质量可伸缩 | 空间可伸缩 |
|---|---|---|
| 分辨率 | 所有层相同 | 各层不同 |
| 实现复杂度 | 较低 | 较高 |
| 带宽适应 | 质量变化 | 分辨率变化 |
| 应用场景 | 存储归档 | 实时通信 |
5. 组合可伸缩性
5.1 空间 × 时间组合
实际应用中常组合多种可伸缩性:
L3T3 模式 (3 空间层 × 3 时间层):
T0(7.5fps) T1(15fps) T2(30fps)
┌──────────┬──────────┬──────────┐
S2 (1080p) │ S2T0 │ S2T1 │ S2T2 │
├──────────┼──────────┼──────────┤
S1 (720p) │ S1T0 │ S1T1 │ S1T2 │
├──────────┼──────────┼──────────┤
S0 (360p) │ S0T0 │ S0T1 │ S0T2 │
└──────────┴──────────┴──────────┘
总共 9 个子层,可以组合出多种输出质量
5.2 常用组合模式
| 模式 | 空间层 | 时间层 | 典型应用 |
|---|---|---|---|
| L1T1 | 1 | 1 | 无 SVC(普通编码) |
| L1T3 | 1 | 3 | 固定分辨率,帧率自适应 |
| L3T1 | 3 | 1 | 固定帧率,分辨率自适应 |
| L3T3 | 3 | 3 | 完全自适应 |
| L3T3_KEY | 3 | 3 | 关键帧同步模式 |
5.3 解码组合示例
L3T3 可产生的输出组合:
1. 网络极差: S0T0 (360p @ 7.5fps)
2. 网络较差: S0T1 (360p @ 15fps)
3. 网络一般: S1T1 (720p @ 15fps)
4. 网络良好: S1T2 (720p @ 30fps)
5. 网络优秀: S2T2 (1080p @ 30fps)
每种组合只需要解码部分层
6. SVC 在 WebRTC 中的应用
6.1 各编码器的 SVC 支持
| 编码器 | 空间可伸缩 | 时间可伸缩 | 质量可伸缩 | WebRTC 支持 |
|---|---|---|---|---|
| VP9 | ✓ | ✓ | ✗ | 原生支持 |
| AV1 | ✓ | ✓ | ✓ | 原生支持 |
| H.264 | ✓ (SVC 扩展) | ✓ (SVC 扩展) | ✓ (SVC 扩展) | 有限 |
| H.265 | ✓ (SHVC) | ✓ (SHVC) | ✓ (SHVC) | 有限 |
6.2 VP9 SVC 结构
VP9 原生支持空间和时间可伸缩:
VP9 SVC 编码结构:
关键帧 (KEY)
│
├── S0T0 (基础层)
│
├── S0T1 (时间增强)
│
├── S1T0 (空间增强 + 基础时间)
│
├── S1T1 (空间 + 时间增强)
│
└── ...
VP9 使用 "超级帧" 概念,将多个空间层打包在一起
6.3 SFU 转发策略
flowchart TB
subgraph 发送端
A[SVC 编码器] --> B[多层码流<br>S0+S1+S2]
end
subgraph SFU
B --> C{分析接收端能力}
C --> |带宽低| D[只转发 S0]
C --> |带宽中| E[转发 S0+S1]
C --> |带宽高| F[转发 S0+S1+S2]
end
subgraph 接收端
D --> G[360p 解码]
E --> H[720p 解码]
F --> I[1080p 解码]
end
SFU 转发优势:
- 发送端只发送一次(单流)
- SFU 按需转发不同层
- 每个接收端获得适合的质量
- 节省上行带宽
6.4 模式表示法
L(空间层数)T(时间层数)[_后缀]
常用模式:
┌──────────┬─────────────────────────────────────────┐
│ 模式 │ 说明 │
├──────────┼─────────────────────────────────────────┤
│ L1T1 │ 单层,无 SVC │
│ L1T2 │ 1 空间层,2 时间层 (15/30 fps) │
│ L1T3 │ 1 空间层,3 时间层 (7.5/15/30 fps) │
│ L2T1 │ 2 空间层,1 时间层 │
│ L2T2 │ 2 空间层,2 时间层 │
│ L2T3 │ 2 空间层,3 时间层 │
│ L3T1 │ 3 空间层,1 时间层 │
│ L3T2 │ 3 空间层,2 时间层 │
│ L3T3 │ 3 空间层,3 时间层(完整 SVC) │
│ L3T3_KEY │ 带关键帧同步的 L3T3 │
└──────────┴─────────────────────────────────────────┘
后缀说明:
_KEY: 关键帧同步,所有空间层的关键帧对齐
_HIGHPRED: 高预测精度模式
7. SVC 的挑战与权衡
7.1 编码效率损失
与传统单层编码相比,SVC 会有一定的效率损失:
| 配置 | 效率损失 | 说明 |
|---|---|---|
| L1T3 | ~5-10% | 时间可伸缩损失较小 |
| L3T1 | ~10-15% | 空间可伸缩损失中等 |
| L3T3 | ~15-25% | 组合损失较大 |
效率损失原因:
- 增强层的预测精度受限
- 运动估计只能在基础层参考
- 层间冗余无法完全消除
7.2 编码复杂度
| 操作 | 单层编码 | SVC 编码 | 复杂度比 |
|---|---|---|---|
| 帧内预测 | 1次 | 多次(每层) | 1.2-1.5x |
| 帧间预测 | 1次 | 多次 | 1.3-1.8x |
| 率失真优化 | 1次 | 层间联合 | 1.5-2x |
| 总体 | 1x | - | 1.5-2.5x |
7.3 延迟影响
SVC 对延迟的影响:
发送端:
- 编码时间增加: +10-30%
- 帧大小波动减小(对网络更友好)
接收端:
- 解码时间基本不变
- 可以提前显示低质量,再增强(渐进解码)
网络:
- 抖动容忍度提高
- 丢包恢复更灵活
7.4 适用场景分析
| 场景 | SVC 适用性 | 推荐模式 |
|---|---|---|
| 1v1 通话 | 不推荐 | 单层即可 |
| 小型会议 (3-6人) | 推荐 | L1T3 或 L2T3 |
| 大型会议 (10+人) | 强烈推荐 | L3T3 |
| 网络不稳定 | 强烈推荐 | L1T3 |
| 录制回放 | 可选 | 根据存储需求 |
8. SVC 实现细节
8.1 NAL 单元结构(H.264 SVC)
H.264 SVC NAL 扩展:
┌──────────────────────────────────────┐
│ NAL Header (1 byte) │
├──────────────────────────────────────┤
│ SVC Extension Header (3 bytes) │
│ ┌────────────────────────────────┐ │
│ │ idr_flag | priority_id | ... │ │
│ │ no_inter_layer_pred | ... │ │
│ │ dependency_id | quality_id │ │
│ │ temporal_id | anchor_pic_flag │ │
│ └────────────────────────────────┘ │
├──────────────────────────────────────┤
│ RBSP Payload │
└──────────────────────────────────────┘
关键字段:
- dependency_id: 空间层标识 (DID)
- quality_id: 质量层标识 (QID)
- temporal_id: 时间层标识 (TID)
8.2 VP9 SVC 结构
VP9 SVC 超级帧结构:
┌─────────────────────────────────────────────┐
│ 超级帧头 │
│ - 帧数量 │
│ - 各帧大小索引 │
├─────────────────────────────────────────────┤
│ 帧 1 (S0T0 - 基础层) │
├─────────────────────────────────────────────┤
│ 帧 2 (S0T1 - 时间增强) │
├─────────────────────────────────────────────┤
│ 帧 3 (S1T0 - 空间增强) │
├─────────────────────────────────────────────┤
│ ... │
└─────────────────────────────────────────────┘
超级帧将多个空间层打包在一起
SFU 可以选择性转发其中的帧
8.3 层间预测
层间预测类型:
1. 帧内层间预测:
- 上采样基础层的重建像素
- 作为增强层的预测参考
2. 帧间层间预测:
- 使用基础层的运动信息
- 运动矢量继承/缩放
3. 残差预测:
- 增强层残差 = 原始残差 - 上采样基础层残差
编码效率: 层间预测 > 独立编码
复杂度: 层间预测 > 独立编码
9. 总结
9.1 SVC 三种模式对比
| 类型 | 变化的维度 | 典型配置 | 主要用途 |
|---|---|---|---|
| 空间可伸缩 | 分辨率 | 360p/720p/1080p | 适应不同终端 |
| 时间可伸缩 | 帧率 | 7.5/15/30fps | 适应网络波动 |
| 质量可伸缩 | 信噪比 | 低/中/高质量 | 存储归档 |
9.2 SVC 优势
- 带宽效率:单流多质量,避免 Simulcast 的冗余
- 平滑适应:网络变化时平滑降级,无跳变
- SFU 友好:服务器只转发,无需解码重编码
- 灵活组合:空间+时间可任意组合
9.3 SVC 挑战
- 编码复杂度:比单层编码高 50-150%
- 效率损失:比同等单层编码大 10-25%
- 兼容性:需要编码器和解码器都支持
- 实现复杂:需要精细的码率控制和层间预测
9.4 选择建议
| 场景 | 推荐方案 |
|---|---|
| 1v1 通话 | 不用 SVC |
| 小型会议 | VP9 L1T3 或 L2T2 |
| 大型会议 | VP9 L3T3 |
| 带宽受限 | 时间可伸缩优先 |
| 终端异构 | 空间可伸缩优先 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 青羽川!
评论
