音视频修炼之编码器(一):AVC、HEVC编码器内部

H.264 / H.265 编码器内部架构

基础理论篇讲过 H.264 的"标准是什么", 这篇讲"编码器内部怎么实现"------以 x264 / x265 为代表, 拆开看每一块.


本文速览

章节 阅读重点
0. 编码器五大块 把握本节核心概念和使用场景
1. 帧间 / 帧内 决策 把握本节核心概念和使用场景
2. 帧内预测 (Intra) 把握本节核心概念和使用场景
3. 帧间预测 (Inter) 把握本节核心概念和使用场景
4. 变换 + 量化 把握本节核心概念和使用场景
5. 熵编码 把握本节核心概念和使用场景
6. 码率控制 (Rate Control) 把握本节核心概念和使用场景
7. 后处理: 去块滤波 把握本节核心概念和使用场景
8. x264 编码流程 重点看数据/调用如何流转
9. 编码器复杂度对比 按场景做技术取舍
后续章节 余下 2 节继续按"概念 → 示例 → 坑点 → 总结"展开

0. 编码器五大块

任何编码器都是这五块, 只是各家算法不同.


1. 帧间 / 帧内 决策

1.1 GOP 结构

最常见 : IBBPBBPBBP...

I (关键帧) 每 N 帧一个

P (前向预测) 参考前面的 I 或 P

B (双向预测) 参考前后 (压缩率最高)

x264 默认 :

--keyint 250 (250 帧 = 10 秒@25fps)

--bframes 3 (最多 3 个连续 B)

1.2 帧类型决策

"这一帧是 I 还是 P 还是 B?"

简单策略 :

每 250 帧强制 I

其他都是 P

高级 (x264) :

场景切换检测 → 强制 I

动态调整 B 帧数

开放 GOP / 闭合 GOP


2. 帧内预测 (Intra)

2.1 H.264

H.264 的帧内预测按块大小分两类:小块更精细,大块更省计算。

块类型 预测模式 适合场景
4×4 块 9 种预测方向:0 垂直、1 水平、2 DC 平均、3~8 斜向 纹理复杂、边缘变化多的小区域
16×16 块 4 种预测方向:垂直 / 水平 / DC / Plane 大面积平坦区域,模式少、开销低

编码器真正做的是 Mode Decision:把可选方向都试一遍,选择"预测后残差最小、码率代价最低"的模式。

2.2 H.265

H.265 的核心变化是:预测方向更多、块更大,所以平坦区域能用更少码率表达。

对比项 H.264 H.265 影响
帧内预测方向 9 种 35 种 方向更细,边缘 / 纹理预测更准
最大块大小 16×16 64×64 大块平坦区域更省码率
压缩收益 基准 更高 同等主观画质下码率更低

一句话记忆:H.265 用"更多方向 + 更大块"换来更好的预测,从而减少残差、节省码率。


3. 帧间预测 (Inter)

3.1 运动估计 (ME)

当前块 vs 参考帧 :

在参考帧中找"最像"的块

→ 运动矢量 (MV)

→ 残差 (差值)

搜索算法 :

全搜索 (FS): 最准, 最慢

钻石搜索 (DIA)

六边形 (HEX)

EPZS (x264 推荐)

UMH (x265)

3.2 子像素精度

H.264 : 1/4 pixel (插值 6-tap 滤波器)

H.265: 1/4 pixel (8-tap 滤波器)

精度越高, 压缩越好但越慢

3.3 多参考帧

内容
H.264 最多 16 个参考帧
H.265 最多 16 个
x264 默认 ref=3

4. 变换 + 量化

4.1 整数 DCT

H.264 :

4×4, 8×8 整数 DCT

H.265 :

4×4, 8×8, 16×16, 32×32

→ 大块更高效

DST (Discrete Sine Transform) :

H.265 帧内 4×4 块用 DST (亮度)

比 DCT 更适合帧内

4.2 量化

量化决定"保留多少细节":数值越大,码率越小,但画质损失越明显。

参数 范围 / 推荐 含义 画质影响
QP(Quantization Parameter) 0~51 编码标准里的量化参数 QP 越大,压缩越狠,画质越差
QP = 0 无损 基本不丢信息 码率极高
QP ≈ 22 高质量 常见高画质档 细节保留较多
QP ≈ 28 一般质量 常见折中档 码率明显下降
QP ≈ 35 低质量 强压缩 容易出现块效应 / 细节糊掉
CRF(Constant Rate Factor) 22~28 x264 推荐的恒定质量控制方式 适合大多数离线转码场景

调参直觉:想要体积小就提高 QP / CRF,想要画质好就降低 QP / CRF。


5. 熵编码

5.1 CABAC (Context-Adaptive Binary Arithmetic Coding)

H.264 main 以上, H.265 全用

原理 :

根据前文上下文, 调整概率

→ 出现频繁的符号用更短的码

特点 :

压缩率: 比 CAVLC 高 10-15%

速度: 比 CAVLC 慢

5.2 CAVLC

CAVLC 是 H.264 Baseline 常见的熵编码方式,特点是兼容性好、速度快,但压缩率不如 CABAC。

CAVLC CABAC
典型使用 H.264 Baseline / 老设备兼容 H.264 Main 及以上、H.265 默认
压缩率 较低 更高,通常比 CAVLC 省 10~15% 码率
速度 更快 更慢,计算复杂度更高
x264 参数 --no-cabac --cabac,默认开启
适合场景 老设备、低复杂度、兼容优先 画质 / 码率优先的主流场景

一句话记忆:CAVLC 是"快但压缩差一点",CABAC 是"慢一点但更省码率"。


6. 码率控制 (Rate Control)

6.1 三种模式

CBR (Constant Bit Rate) :

恒定码率, 直播用

画质波动大

VBR (Variable Bit Rate) :

可变码率, 点播用

动态场景给高码率, 静止低

画质均衡

CRF (Constant Rate Factor) :

恒定质量, x264 推荐

画质恒定, 文件大小不固定

6.2 x264 参数

用途 命令
CRF 模式 (推荐) ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
CBR ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -minrate 2M -maxrate 2M -bufsize 2M output.mp4
VBR (2-pass) ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -f null /dev/null
VBR (2-pass) ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 output.mp4

7. 后处理: 去块滤波

量化导致块边界不连续

→ Deblocking Filter (DBF)

H.264 : 帧间循环

H.265 :

DBF + SAO (Sample Adaptive Offset)

SAO 进一步去除振铃


8. x264 编码流程

x264_encoder_encode() 可以理解成"读帧 → 预分析 → 编码 → 输出 NAL"的流水线:

阶段 模块 / 动作 主要工作 产物
1 读入 frame 接收输入图像帧,准备进入编码队列 原始输入帧
2 lookahead 做 B 帧决策、场景切换检测、mb-tree 分析 帧类型和复杂度预估
3.1 analyse 选择帧内 / 帧间模式 最优预测模式
3.2 me 运动估计 在参考帧里找最像的块 运动矢量 MV + 残差
3.3 transform + quant 变换到频域并量化 量化系数
3.4 entropy CABAC / CAVLC 熵编码 压缩后的 bitstream
3.5 deblock 去块滤波,减少块边界伪影 环路滤波后的参考帧
4 输出 NAL 单元 封装成 H.264 NAL 可写入码流 / 容器的数据

x264 源码主入口:encoder/encoder.c

一句话记忆:x264 的主流程就是先决定"怎么预测",再计算"残差怎么压",最后输出 NAL。


9. 编码器复杂度对比

单 frame 1080p 30fps 编码耗时 (现代 CPU 单线程):

内容
H.264 x264 ultrafast ~5ms
H.264 x264 medium ~15ms
H.264 x264 veryslow ~80ms
H.265 x265 medium ~50ms
H.265 x265 slow ~150ms
AV1 SVT-AV1 medium ~200ms
AV1 libaom-av1 ~1000ms ⛔

10. 实战: 不同 preset 对比

原始: 1080p 30fps 60 秒 H.264 → H.265

说明
preset 速度 码率 画质 (VMAF)

说明
ultrafast 5x 2.5M 88
fast 2x 2.0M 90
medium 1x 1.8M 92 ← 推荐
slow 0.5x 1.7M 93
veryslow 0.2x 1.6M 94

结论: medium 是性价比最高的 preset.


11. 总结

五大块:

帧间/内决策 + 运动估计 + 变换量化 + 熵编码 + 码率控制

调参顺序 (x264):

  1. preset (medium 起步)
  2. crf (23-28)
  3. tune (film/animation/grain/...)
  4. profile (high 通常)
  5. level (4.1 1080p, 5.1 4K)

金句: 编码器内部是"压榨每一个比特"的艺术------同样的 1080p 视频, x264 能省到 2 Mbps, x265 能省到 1 Mbps, AV1 能到 0.7 Mbps. 这背后是无数算法上的精雕细琢.

相关推荐
昨日之日20063 小时前
AuK:多任务语音生成编辑,支持克隆、改词、换情绪与分离,内容编辑与增强全覆盖
人工智能·音视频
云栖梦泽3 小时前
网络设备驱动(1)
linux·arm开发·嵌入式硬件
智购科技无人售货机工厂3 小时前
2026自动售货机AI智能体架构:从47个小模型到33.7亿Token的工程实践~YH
android·人工智能·驱动开发·单片机·pandas
羑悻的小杀马特3 小时前
数据织网者:Jsoncpp库深度解析——从C++原生JSON处理到工程级数据交互实战全攻略
c++·json·交互·jsoncpp·原生库
Jia ming4 小时前
从打补丁到一行配置:PREEMPT_RT 主线化之后,实时内核到底该怎么配?
linux
杨云龙UP4 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
果果燕4 小时前
实习笔记(七)GFP自动化插拔测试功能协议解析
c++
宁渡AI大模型4 小时前
河南宁渡科技有限公司|宁渡课堂 AI 全栈面试分享,AI 应用开发高频考点汇总
java·c++·人工智能·python·深度学习·神经网络·rag
GG-_-Bond4 小时前
9.1 kv存储内存池模拟面试问题
c++·c