数字视频处理

Abstract

数字视频处理

Authors

Walter Fan

Status

v1.0

Updated

2026-03-20

数字视频

视频是动起来的图片。当连续的静态图像以足够快的速率播放时,人眼的视觉暂留效应会将其感知为连续的运动画面。 数字视频就是将这些图像以数字方式采样、量化和存储的技术。

视频采样

视频采样涉及三个维度:

  • 空间采样 (分辨率): 每帧图像在水平和垂直方向上的像素数量

  • 时间采样 (帧率): 每秒采集的帧数 (fps)

  • 幅度量化 (位深): 每个像素分量的量化精度

常见分辨率:

名称

分辨率

像素数

480p (SD)

640×480

307,200

720p (HD)

1280×720

921,600

1080p (Full HD)

1920×1080

2,073,600

4K (UHD)

3840×2160

8,294,400

常见帧率:24fps (电影)、25fps (PAL)、30fps (NTSC)、60fps (高帧率)。 WebRTC 中通常使用 15~30fps,根据带宽动态调整。

色彩空间

RGB 色彩空间

RGB 使用红 (Red)、绿 (Green)、蓝 (Blue) 三个分量表示颜色, 每个分量通常用 8 bit 表示 (0~255),一个像素占 24 bit。 RGB 适合显示设备,但不适合视频压缩。

YUV 色彩空间

YUV 将亮度 (Y) 和色度 (U/V 或 Cb/Cr) 分离:

  • Y (Luminance): 亮度分量,携带大部分视觉信息

  • U/Cb (Chrominance Blue): 蓝色色差

  • V/Cr (Chrominance Red): 红色色差

人眼对亮度比色度更敏感,因此可以对色度进行下采样以减少数据量。

常见的 YUV 采样格式:

  • 4:4:4: 每个像素都有完整的 Y、U、V 分量,无下采样

  • 4:2:2: 水平方向色度减半,每两个像素共享一组 UV

  • 4:2:0: 水平和垂直方向色度都减半,每四个像素共享一组 UV

WebRTC 内部主要使用 I420 格式 (YUV 4:2:0 planar):

I420 内存布局 (以 4x4 图像为例):
YYYY    ← Y plane (4x4 = 16 bytes)
YYYY
YYYY
YYYY
UU      ← U plane (2x2 = 4 bytes)
UU
VV      ← V plane (2x2 = 4 bytes)
VV
总计: 16 + 4 + 4 = 24 bytes (相比 RGB 的 48 bytes 节省 50%)

RGB 与 YUV 的转换公式:

Y  =  0.299 * R + 0.587 * G + 0.114 * B
Cb = -0.169 * R - 0.331 * G + 0.500 * B + 128
Cr =  0.500 * R - 0.419 * G - 0.081 * B + 128

视频压缩原理

未压缩的视频数据量巨大。以 1080p@30fps 为例:

1920 × 1080 × 1.5 (I420) × 30 × 8 = 746 Mbps

这远超网络传输能力,因此视频压缩是必不可少的。

帧内压缩 (Intra-frame)

帧内压缩只利用单帧内部的空间冗余,不依赖其他帧:

  • 变换编码: 将空间域像素块通过 DCT 或整数变换转换到频率域

  • 量化: 对变换系数进行量化,丢弃高频细节 (有损压缩的主要来源)

  • 熵编码: 对量化后的系数进行 CABAC 或 CAVLC 无损压缩

帧内编码的帧称为 I 帧 (Intra Frame) 或关键帧 (Key Frame),可以独立解码。

帧间压缩 (Inter-frame)

帧间压缩利用相邻帧之间的时间冗余:

  • 运动估计 (Motion Estimation): 在参考帧中搜索与当前块最匹配的区域

  • 运动补偿 (Motion Compensation): 用运动向量和参考块预测当前块

  • 残差编码: 只编码预测值与实际值的差异 (残差)

帧间编码的帧类型:

  • P 帧 (Predicted Frame): 参考前面的帧进行预测

  • B 帧 (Bi-predicted Frame): 参考前后两个方向的帧进行预测

I ← P ← P ← P ← I ← P ← P    (无 B 帧, 低延迟)
I ← B → P ← B → P ← B → I    (有 B 帧, 高压缩率)

在 WebRTC 实时通信中,通常 不使用 B 帧 以降低编码延迟。

WebRTC 中的视频编解码器

  • VP8: Google 开源,WebRTC 必须支持的编解码器

  • VP9: VP8 的继任者,压缩效率提升约 30%,支持 SVC

  • H.264/AVC: 最广泛使用的编解码器,硬件支持好

  • H.265/HEVC: 压缩效率比 H.264 提升约 50%,但专利问题限制了使用

  • AV1: 开源免专利费,压缩效率优秀,逐渐成为新标准

参考资料

  • Digital Video Processing - A. Murat Tekalp

  • WebRTC 支持的视频格式: common_video/include/video_frame_buffer.h