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 优势

  1. 带宽效率:单流多质量,避免 Simulcast 的冗余
  2. 平滑适应:网络变化时平滑降级,无跳变
  3. SFU 友好:服务器只转发,无需解码重编码
  4. 灵活组合:空间+时间可任意组合

9.3 SVC 挑战

  1. 编码复杂度:比单层编码高 50-150%
  2. 效率损失:比同等单层编码大 10-25%
  3. 兼容性:需要编码器和解码器都支持
  4. 实现复杂:需要精细的码率控制和层间预测

9.4 选择建议

场景 推荐方案
1v1 通话 不用 SVC
小型会议 VP9 L1T3 或 L2T2
大型会议 VP9 L3T3
带宽受限 时间可伸缩优先
终端异构 空间可伸缩优先