视频编解码技术详解

视频编解码(Video Codec)是数字视频处理的核心技术,通过压缩算法将原始视频数据转换为更小的文件大小,同时在解码时恢复视频内容。本文将深入探讨 H.264 和 H.265 两种主流视频编码标准的原理、特点及其在嵌入式系统中的应用。

原始视频数据量巨大。以1080p@30fps视频为例: - 分辨率:1920×1080像素 - 帧率:30帧/秒 - 色深:24位(RGB各8位) - 数据率:1920 × 1080 × 30 × 24 = 1.49 Gbps ≈ 186 MB/s

一、基本概念

1.1 视频压缩原理

视频压缩利用了三种冗余:

  1. 空间冗余(Spatial Redundancy) - 同一帧内相邻像素往往相似 - 通过帧内预测和变换编码消除 - 例如:蓝天区域的像素值变化很小

  2. 时间冗余(Temporal Redundancy) - 连续帧之间内容高度相似 - 通过运动估计和运动补偿消除 - 例如:静止背景在多帧中保持不变

  3. 视觉冗余(Perceptual Redundancy) - 人眼对某些信息不敏感 - 通过量化过程去除 - 例如:高频细节、色度信息

1.2 基本术语

  • 帧类型:

    • I 帧(Intra Frame):关键帧,独立编码,不依赖其他帧
    • P 帧(Predicted Frame):预测帧,参考前面的 I 帧或 P 帧
    • B 帧(Bidirectional Frame):双向预测帧,参考前后帧
  • GOP(Group of Pictures):

    • 一组连续的视频帧,以 I 帧开始
    • 典型结构:IBBPBBPBBPBBI…
    • GOP 越长,压缩率越高,但随机访问性能越差
  • 码率控制:

    • CBR(Constant Bit Rate):恒定码率,适合流媒体传输
    • VBR(Variable Bit Rate):可变码率,适合本地存储
    • ABR(Average Bit Rate):平均码率,兼顾质量和大小
  • 分辨率与帧率:

    • 常见分辨率:720p (1280×720)、1080p (1920×1080)、4K (3840×2160)
    • 常见帧率:24fps(电影)、30fps(标清)、60fps(高清)

二、H.264/AVC 编码标准

2.1 简介

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

主要特点:

  • 相比 MPEG-2,压缩效率提高 50% 以上 - 支持多种应用场景(广播、流媒体、存储)
  • 良好的网络适应性
  • 广泛的硬件支持

应用场景:

  • 蓝光光盘
  • 数字电视广播
  • 视频会议
  • 网络视频(YouTube、Netflix 等)
  • 监控摄像头
  • 移动设备视频
Profile 特点 应用
Baseline 基本工具,低复杂度 视频会议、移动设备
Main 支持B帧和CABAC 数字电视广播
High 支持8×8变换 蓝光、HDTV
High 10 支持10位色深 专业视频
Level 最大分辨率 最大帧率 应用
3.0 720×576 30fps SD 视频
3.1 1280×720 30fps 720p HD
4.0 1920×1080 30fps 1080p HD
5.1 1920×1080 60fps 1080p 60fps

2.2 编码流程

H.264 编码器的基本处理流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
原始视频
↓
[帧内/帧间预测] → 预测块
↓
[残差计算] → 残差数据
↓
[变换编码] → DCT系数
↓
[量化] → 量化系数
↓
[熵编码] → 压缩码流
↓
编码视频

详细步骤说明:

  1. 预测(Prediction)
  2. 帧内预测:利用当前帧已编码的相邻块预测当前块
  3. 帧间预测:利用参考帧通过运动估计预测当前块
  4. 生成预测块,计算残差(原始块 - 预测块)
  5. 变换(Transform)
  6. 对残差数据进行整数 DCT 变换
  7. 将空间域信号转换到频率域
  8. H.264 使用 4×4 或 8×8 整数变换
  9. 量化(Quantization)
  10. 将变换系数除以量化步长
  11. 这是有损压缩的主要来源
  12. 量化参数(QP)控制压缩质量和码率
  13. 熵编码(Entropy Coding)
  14. 使用 CAVLC 或 CABAC 算法
  15. 无损压缩,进一步减小数据量
  16. CABAC 效率更高但计算复杂度更大
  17. 环路滤波(Loop Filter)
  18. 去块滤波,消除块效应
  19. 提高主观视觉质量
  20. 改善参考帧质量

2.3 解码流程

解码过程是编码的逆过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
编码码流
↓
[熵解码] → 量化系数
↓
[反量化] → DCT系数
↓
[反变换] → 残差数据
↓
[预测重建] → 预测块
↓
[相加] → 重建块
↓
[去块滤波] → 输出帧
↓
解码视频

三、H.265/HEVC编码标准

3.1 简介

H.265(也称为 HEVC - High Efficiency Video Coding)是 H.264 的继任者,于 2013 年发布。

主要改进:

  • 相比 H.264,压缩效率提高约 50%
  • 更好地支持 4K/8K 超高清视频
  • 改进的并行处理能力
  • 更灵活的编码结构

应用场景:

  • 4K/8K 超高清视频
  • 流媒体服务(Netflix 4K)
  • 新一代广播标准
  • VR/AR 视频
  • 监控系统(节省存储空间)

3.2 H.264 vs H.265 对比

特性 H.264 H.265
压缩效率 基准 提高50%
最大块大小 16×16 64×64
帧内预测模式 9种 35种
变换大小 4×4, 8×8 4×4到32×32
并行处理 有限 良好支持
编码复杂度 中等 高
解码复杂度 低 中等
硬件支持 广泛 逐渐普及

实际效果对比:

  • 相同质量下,H.265 文件大小约为 H.264 的 50%
  • 相同码率下,H.265 视觉质量明显优于 H.264
  • H.265 编码时间约为 H.264 的 2-3 倍
  • H.265 解码复杂度约为 H.264 的 1.5 倍

四、编解码性能参数

4.1 码率与质量关系

不同分辨率的推荐码率(H.264):

分辨率 帧率 低质量 中等质量 高质量
480p 30fps 1 Mbps 2.5 Mbps 4 Mbps
720p 30fps 2.5 Mbps 5 Mbps 8 Mbps
1080p 30fps 5 Mbps 8 Mbps 12 Mbps
1080p 60fps 8 Mbps 12 Mbps 20 Mbps
4K 30fps 15 Mbps 25 Mbps 45 Mbps

H.265 可以在相同质量下使用约 50% 的码率。

4.2 编解码性能指标

编码性能:

  • 编码速度:帧/秒(fps),实时编码需要 ≥ 视频帧率
  • 压缩比:原始大小/压缩后大小,通常 50:1 到 200:1
  • 编码延迟:从输入到输出的时间,实时应用要求 < 100ms

解码性能:

  • 解码速度:必须 ≥ 视频帧率才能流畅播放
  • 解码延迟:通常比编码延迟小得多
  • 内存占用:参考帧缓存、解码缓冲区

质量评估:

  • PSNR(峰值信噪比):客观质量指标,单位 dB,越高越好
  • SSIM(结构相似性):更符合人眼感知的质量指标
  • 主观质量:人眼观看评分,最终标准

五、示例:使用 FFmpeg 进行编解码

将 YUV 转换为 H.264:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>

// 初始化编码器
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext *ctx = avcodec_alloc_context3(codec);

// 设置编码参数
ctx->width = 1920;
ctx->height = 1080;
ctx->time_base = (AVRational){1, 30}; // 30fps
ctx->framerate = (AVRational){30, 1};
ctx->pix_fmt = AV_PIX_FMT_YUV420P;
ctx->bit_rate = 4000000; // 4Mbps
ctx->gop_size = 30; // GOP大小
ctx->max_b_frames = 2; // B帧数量

// 设置H.264特定参数
av_opt_set(ctx->priv_data, "preset", "medium", 0);
av_opt_set(ctx->priv_data, "profile", "high", 0);

// 打开编码器
avcodec_open2(ctx, codec, NULL);

// 编码一帧
AVFrame *frame = av_frame_alloc();
frame->format = ctx->pix_fmt;
frame->width = ctx->width;
frame->height = ctx->height;
av_frame_get_buffer(frame, 0);

// 填充YUV数据到frame...

AVPacket *pkt = av_packet_alloc();
int ret = avcodec_send_frame(ctx, frame);
if (ret >= 0) {
ret = avcodec_receive_packet(ctx, pkt);
if (ret >= 0) {
// pkt包含编码后的H.264数据
// 可以写入文件或发送到网络
}
}

// 清理资源
av_packet_free(&pkt);
av_frame_free(&frame);
avcodec_free_context(&ctx);

视频编解码技术详解
http://example.com/2026/08/20/视频编解码技术详解/
作者
Yu xin
发布于
2026年8月20日
许可协议