音视频学习2-编码技术

214 阅读12分钟

视频编码标准深入学习报告

H.264、H.265基本原理与MJPEG特点分析

目标: 深入理解现代视频编码技术的核心原理


目录

  1. 视频编码基础概念
  2. H.264 (AVC) 编码原理详解
  3. H.265 (HEVC) 编码原理详解
  4. H.264与H.265对比分析
  5. MJPEG编码特点
  6. 实际应用场景分析
  7. 学习总结与建议

1. 视频编码基础概念

1.1 什么是视频编码?

视频编码是将原始视频数据压缩成更小文件的过程,目的是:

  • 减少存储空间:原始视频文件非常大(1080p视频每秒约150MB)
  • 降低传输带宽:网络传输需要更小的数据量
  • 保持视觉质量:在压缩的同时尽量保持视频质量

1.2 视频编码的基本流程

原始视频 → 预处理 → 编码器 → 压缩数据 → 传输/存储 → 解码器 → 显示

1.3 视频数据的冗余性

视频压缩之所以可能,是因为视频数据存在大量冗余:

空间冗余(Spatial Redundancy)

  • 同一帧内相邻像素往往相似
  • 例如:蓝天区域的像素值基本相同

时间冗余(Temporal Redundancy)

  • 连续帧之间变化很小
  • 例如:静止背景在多帧中保持不变

视觉冗余(Visual Redundancy)

  • 人眼对某些细节不敏感
  • 可以适当损失这些信息而不影响观感

2. H.264 (AVC) 编码原理详解

H.264(Advanced Video Coding)是目前应用最广泛的视频编码标准,由ITU-T和ISO联合制定。

2.1 H.264编码架构图

graph TD
    A[输入视频] --> B[帧内/帧间预测]
    B --> C[残差计算]
    C --> D[变换量化]
    D --> E[熵编码]
    E --> F[输出码流]
    
    %% 反向重构路径
    D --> G[反量化]
    G --> H[反变换]
    H --> I[重构像素]
    I --> J[重构帧缓存]
    J --> B
    
    %% 样式定义
    classDef inputOutput fill:#e1f5fe
    classDef prediction fill:#f3e5f5
    classDef transform fill:#e8f5e8
    classDef coding fill:#fff3e0
    classDef reconstruction fill:#fce4ec
    
    class A,F inputOutput
    class B,J prediction
    class C,D,G,H transform
    class E coding
    class I,K reconstruction

2.2 帧内预测(Intra Prediction)

基本原理: 帧内预测利用当前帧内已编码像素预测未编码像素,消除空间冗余。

H.264帧内预测模式:

4×4亮度块预测模式(9种):

  1. 垂直预测(Vertical):使用上方像素向下复制
  2. 水平预测(Horizontal):使用左侧像素向右复制
  3. DC预测:使用上方和左侧像素的平均值
  4. 对角左下预测:沿对角线方向预测
  5. 对角右下预测:沿另一对角线方向预测
  6. 垂直右预测:垂直预测的变形
  7. 水平下预测:水平预测的变形
  8. 垂直左预测:垂直预测的另一变形
  9. 水平上预测:水平预测的另一变形

16×16亮度块预测模式(4种):

  • 垂直、水平、DC、平面预测

色度预测模式(4种):

  • 与16×16亮度预测类似

预测过程示例:

已编码像素:  A B C D
             E F G H
             I J ? ?  ← 待预测像素
             M N ? ?

垂直预测:? = C, D的值向下复制
水平预测:? = I, M的值向右复制
DC预测:  ? = (A+B+C+D+E+I+M+N)/8

2.3 帧间预测(Inter Prediction)

基本原理: 帧间预测通过运动估计和运动补偿,利用参考帧预测当前帧,消除时间冗余。

运动估计过程:

  1. 搜索范围确定:在参考帧中确定搜索区域
  2. 块匹配:寻找与当前块最相似的参考块
  3. 运动向量计算:记录最佳匹配位置的偏移量

运动补偿类型:

块大小分割:

16×16宏块可分割为:
16×16 (1个块)
16×8  (2个块)
8×16  (2个块)
8×8   (4个块)

8×8子块可进一步分割为:
8×8, 8×4, 4×8, 4×4

参考帧类型:

  • I帧(Intra):只使用帧内预测,独立编码
  • P帧(Predictive):使用前向参考帧预测
  • B帧(Bi-predictive):使用前向和后向参考帧预测

运动补偿示例:

当前帧第(x,y)块 = 参考帧第(x+dx, y+dy)块 + 残差
其中(dx, dy)为运动向量

2.4 变换量化(Transform & Quantization)

变换过程:

H.264使用4×4整数DCT变换(Discrete Cosine Transform):

变换矩阵:

T = [1  1  1  1]
    [2  1 -1 -2]
    [1 -1 -1  1]
    [1 -2  2 -1]

变换过程:

  1. 正向变换:Y = T × X × T^T

    • X:4×4像素残差块
    • Y:4×4变换系数矩阵
  2. 频域特性

    • 左上角:低频系数(主要能量)
    • 右下角:高频系数(细节信息)

量化过程:

量化公式:

量化后系数 = round(变换系数 / 量化步长)
量化步长 = 2^(QP/6) × MF

其中:

  • QP:量化参数(0-51)
  • MF:量化乘法因子

量化效果:

  • QP值越大:量化越粗糙,压缩率越高,质量越差
  • QP值越小:量化越精细,压缩率越低,质量越好

量化矩阵示例:

原始变换系数:
[120  45  23   8]
[ 67  34  12   3]
[ 28  15   6   1]
[ 12   5   2   0]

量化后(QP=28):
[15   6   3   1]
[ 8   4   2   0]
[ 4   2   1   0]
[ 2   1   0   0]

2.5 熵编码(Entropy Coding)

H.264支持两种熵编码方式:

1. CAVLC(Context-Adaptive Variable Length Coding)

  • 基于上下文的可变长度编码
  • 根据统计特性分配不同长度的码字
  • 高频符号使用短码字,低频符号使用长码字

CAVLC编码要素:

- 非零系数个数(Total Coeffs)
- 拖尾系数个数(Trailing Ones)
- 各系数的符号
- 各系数的幅值
- 零游程长度(Run Length)

2. CABAC(Context-Adaptive Binary Arithmetic Coding)

  • 基于上下文的二进制算术编码
  • 更高的压缩效率(比CAVLC高5-15%)
  • 计算复杂度更高

CABAC编码过程:

  1. 二值化:将语法元素转换为二进制串
  2. 上下文建模:根据上下文选择概率模型
  3. 算术编码:根据概率进行编码

3. H.265 (HEVC) 编码原理详解

H.265(High Efficiency Video Coding)是H.264的继任者,在保持相同视觉质量的前提下,比特率降低约50%。

3.1 H.265编码架构图

graph TD
    A[输入视频] --> B[CTU分割]
    B --> C[CU/PU/TU决策]
    C --> D[帧内/帧间预测]
    D --> E[残差计算]
    E --> F[变换量化]
    F --> G[熵编码]
    G --> H[输出码流]
    
    %% 反向重构路径
    F --> I[反量化]
    I --> J[反变换]
    J --> K[环路滤波]
    K --> L[重构像素]
    L --> M[参考帧缓存]
    M --> D
    
    %% H.265特有的决策反馈
    C -.-> D
    
    %% 样式定义
    classDef inputOutput fill:#e1f5fe
    classDef structure fill:#f8bbd9
    classDef prediction fill:#f3e5f5
    classDef transform fill:#e8f5e8
    classDef coding fill:#fff3e0
    classDef reconstruction fill:#fce4ec
    classDef filtering fill:#e0f2f1
    
    class A,H inputOutput
    class B,C structure
    class D,M prediction
    class E,F,I,J transform
    class G coding
    class L reconstruction
    class K filtering

3.2 编码树单元(CTU)结构

H.265的层次化结构:

CTU (Coding Tree Unit) - 最大64×64
    ↓
CU (Coding Unit) - 编码单元,8×864×64
    ↓
PU (Prediction Unit) - 预测单元
TU (Transform Unit) - 变换单元

CTU四叉树分割示例:

64×64 CTU 可分割为:
├── 32×32 CU (4个)
│   ├── 16×16 CU (4个)
│   │   ├── 8×8 CU (4个)
│   │   └── ...
│   └── ...
└── ...

3.3 H.265帧内预测增强

预测模式数量大幅增加:

  • H.264:9种预测模式(4×4块)
  • H.265:35种预测模式(所有块大小)

35种预测模式:

模式0:平面预测(Planar)
模式1:DC预测
模式2-34:角度预测(33个方向)

角度预测方向图:

        2  3  4
         \ | /
    18 -- +--+-- 6
         / | \
       16 15 14

每个数字代表一个预测方向
角度范围:-45°到+45°

预测精度提升:

  • 支持1/32像素精度的角度预测
  • 使用双线性插值进行亚像素预测

3.4 H.265帧间预测增强

运动补偿改进:

1. 非对称分割(AMP - Asymmetric Motion Partition)

除了对称分割外,还支持:
16×16 → 12×16 + 4×16
16×16 → 4×16 + 12×16
16×16 → 16×12 + 16×4
16×16 → 16×4 + 16×12

2. 高精度运动向量

  • 支持1/4像素精度运动补偿
  • 使用8抽头插值滤波器

3. 运动向量预测改进

H.264: 中值预测
H.265: AMVP (Advanced Motion Vector Prediction)
      - 多个候选预测向量
      - 更精确的预测

4. Merge模式

  • 直接继承邻近块的运动信息
  • 无需传输额外的运动向量
  • 大幅减少运动信息的编码开销

3.5 H.265变换量化增强

变换尺寸扩展:

  • H.264:仅支持4×4和8×8变换
  • H.265:支持4×4、8×8、16×16、32×32变换

变换类型:

  1. DCT变换:用于帧间预测残差
  2. DST变换:用于4×4帧内预测残差

量化改进:

H.265量化公式:
level = (coeff × scale + offset) >> shift

其中:
- scale: 量化乘法因子
- offset: 舍入偏移
- shift: 右移位数

3.6 环路滤波增强

H.265引入两级环路滤波:

1. 去块滤波(Deblocking Filter)

  • 消除块边界伪影
  • 自适应强度调整

2. SAO滤波(Sample Adaptive Offset)

  • 基于样本的自适应偏移
  • 减少振铃效应和边缘模糊

SAO类型:

类型1:边缘偏移(Edge Offset)
- 检测边缘模式
- 对边缘像素进行偏移校正

类型2:带状偏移(Band Offset)
- 将像素值分为32个带
- 对特定带的像素进行偏移

4. H.264与H.265对比分析

4.1 技术指标对比

特性H.264/AVCH.265/HEVC改进说明
最大CU尺寸16×1664×64更大的编码单元,适应高分辨率
帧内预测模式9种(4×4)35种更精确的方向预测
变换尺寸4×4, 8×84×4~32×32更大变换提高压缩效率
运动向量精度1/4像素1/4像素精度相同但算法优化
环路滤波去块滤波去块滤波+SAO增加SAO显著改善质量
熵编码CAVLC/CABACCABAC改进的CABAC提高效率

4.2 性能对比

压缩效率:

相同视觉质量下:
H.265比特率  H.264比特率 × 50%

示例:
1080p H.264: 8 Mbps
1080p H.265: 4 Mbps (相同质量)

计算复杂度:

编码复杂度:H.265 ≈ H.264 × 2~4倍
解码复杂度:H.265 ≈ H.264 × 1.5~2倍

4.3 应用场景对比

H.264适用场景:

  • 实时通信(低延迟要求)
  • 移动设备(计算能力有限)
  • 传统广播电视
  • 在线直播

H.265适用场景:

  • 4K/8K超高清视频
  • 流媒体服务(Netflix、YouTube)
  • 视频存储
  • 带宽受限的应用

4.4 质量对比示例

主观质量评估:

测试条件:1080p视频,相同比特率
PSNR (Peak Signal-to-Noise Ratio):
H.265比H.264高2-4dB

SSIM (Structural Similarity Index):
H.265: 0.95-0.98
H.264: 0.92-0.95

5. MJPEG编码特点

5.1 MJPEG基本原理

Motion JPEG是将JPEG图像压缩技术应用于视频的简单方法。

编码特点:

  • 每一帧都独立压缩为JPEG图像
  • 不使用帧间预测
  • 编码简单,实现容易

5.2 MJPEG编码流程

视频帧1 → JPEG编码 → 压缩帧1
视频帧2 → JPEG编码 → 压缩帧2
视频帧3 → JPEG编码 → 压缩帧3
...
最终视频 = 压缩帧1 + 压缩帧2 + 压缩帧3 + ...

5.3 MJPEG技术细节

JPEG压缩步骤:

  1. 颜色空间转换:RGB → YUV
  2. 色度抽样:减少色度信息(4:2:0)
  3. 分块:8×8像素块
  4. DCT变换:时域 → 频域
  5. 量化:减少高频分量
  6. 游程编码:压缩零值
  7. 霍夫曼编码:进一步压缩

量化表示例:

亮度量化表(标准):
[16 11 10 16  24  40  51  61]
[12 12 14 19  26  58  60  55]
[14 13 16 24  40  57  69  56]
[14 17 22 29  51  87  80  62]
[18 22 37 56  68 109 103  77]
[24 35 55 64  81 104 113  92]
[49 64 78 87 103 121 120 101]
[72 92 95 98 112 100 103  99]

5.4 MJPEG优缺点分析

优点:

  1. 编码简单:无复杂的运动估计
  2. 延迟低:每帧独立编码/解码
  3. 编辑友好:帧级随机访问
  4. 错误隔离:单帧错误不影响其他帧
  5. 硬件实现简单:可重用JPEG硬件

缺点:

  1. 压缩效率低:不利用时间冗余
  2. 文件大:比H.264大3-5倍
  3. 带宽需求高:不适合网络传输
  4. 质量有限:块效应明显

5.5 MJPEG应用场景

适用场景:

  • 专业视频编辑:需要帧级精确编辑
  • 监控系统:要求低延迟和随机访问
  • 医疗影像:需要无损或近无损质量
  • 工业检测:实时图像处理

不适用场景:

  • 网络视频流
  • 移动设备视频
  • 长时间录像存储

6. 实际应用场景分析

6.1 流媒体服务

Netflix编码策略:

4K内容:H.265 (HEVC)
1080p内容:H.264 (AVC) + H.265
移动端:H.264 (AVC)

YouTube编码选择:

VP9/AV1:Google主推格式
H.264:广泛兼容性
H.265:高分辨率内容

6.2 视频会议系统

编码要求:

  • 低延迟:<200ms端到端
  • 实时编码:硬件加速
  • 网络适应:动态码率调整

技术选择:

Zoom:H.264主要,H.265补充
Teams:H.264优先
WebRTC:VP8/VP9/H.264

6.3 移动设备视频

硬件支持情况:

H.264:
- 编码:所有现代设备支持
- 解码:通用硬件加速

H.265:
- 编码:2016年后设备支持
- 解码:需要专门硬件

MJPEG:
- 简单但效率低
- 主要用于相机预览

6.4 广播电视

标准选择:

数字电视:
- 标清:MPEG-2/H.264
- 高清:H.264
- 4K:H.265

IPTV:
- H.264主流
- H.265逐步推广

7. 学习总结与建议

7.1 关键知识点总结

核心概念理解:

  1. 预测技术是视频压缩的基础

    • 帧内预测消除空间冗余
    • 帧间预测消除时间冗余
  2. 变换量化实现压缩

    • DCT变换集中能量
    • 量化控制质量与码率
  3. 熵编码进一步压缩

    • 根据统计特性分配码字
    • CABAC比CAVLC效率更高

技术演进路径:

MJPEG → H.264 → H.265AV1/VVC
简单   中等     复杂    更复杂
低效   中等     高效    更高效

7.2 学习建议

入门阶段:

  1. 理解基本概念(冗余、预测、变换)
  2. 学习MJPEG原理(相对简单)
  3. 掌握H.264基础流程

进阶阶段:

  1. 深入H.264各模块细节
  2. 对比学习H.265改进点
  3. 实践编码器参数调优

高级阶段:

  1. 研究新一代编码标准(AV1、VVC)
  2. 学习硬件加速实现
  3. 探索AI辅助视频编码

7.3 实践练习建议

工具使用:

FFmpeg:命令行编码工具
x264/x265:开源编码器库
MediaInfo:分析视频参数

练习项目:

  1. 使用不同QP值编码同一视频,观察质量变化
  2. 对比H.264和H.265在相同质量下的文件大小
  3. 分析不同运动剧烈程度视频的压缩效果

参数实验:

# H.264编码示例
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output_h264.mp4

# H.265编码示例  
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output_h265.mp4

# MJPEG编码示例
ffmpeg -i input.mp4 -c:v mjpeg -qscale:v 3 output_mjpeg.avi

7.4 进一步学习资源

标准文档:

  • ITU-T H.264标准规范
  • ITU-T H.265标准规范

开源项目:

  • x264:H.264编码器
  • x265:H.265编码器
  • FFmpeg:多媒体处理框架

学术资源:

  • IEEE Transactions on Circuits and Systems for Video Technology
  • Signal Processing: Image Communication