视频编解码Codec选型指南:H.264 vs H.265 vs AV1
视频编解码Codec选型指南:H.264 vs H.265 vs AV1
从一场关于带宽的抉择说起
项目中需要在有限带宽下传输1080p@60fps视频。H.264跑不动,H.265有专利费,AV1编码太慢。这不是简单的"哪个好"的问题,而是一道涉及压缩效率、计算成本、生态成熟度和专利风险的多元方程。
这篇文章从编码原理出发,把三者的技术内核拆开,然后落到工程选型的实际考量上。
1. 宏观演进:为什么需要新一代Codec?
视频压缩的本质是做三件事:去掉空间冗余、去掉时间冗余、去掉视觉冗余。
每一代Codec都在上述三个环节上做了更精细的划分和更高效的算法。下面这张表直观展示三代的压缩效率差距:
| Codec | 相对于H.264码率节省 | 发布年份 | 标准化组织 |
|---|---|---|---|
| H.264/AVC | 基准线 | 2003 | ITU-T VCEG + ISO MPEG |
| H.265/HEVC | ~50% | 2013 | ITU-T VCEG + ISO MPEG (JCT-VC) |
| AV1 | ~30%(vs H.265) ~65%(vs H.264) | 2018 | Alliance for Open Media |
但"码率节省"四个字背后,是编码复杂度成倍增长。拿个具体数字:在软件编码场景下,AV1的编码耗时大约是H.265的3-5倍,H.264的10-20倍。
2. 编码块结构:从宏块到CTU再到Superblock
2.1 H.264:16x16宏块的天下
H.264把每帧图像分成若干个16x16的宏块(Macroblock, MB) ,这是最基本的处理单元。

每个宏块可以进一步划分成更小的子块做运动补偿:
- 帧间预测:16x16, 16x8, 8x16, 8x8, 8x4, 4x8, 4x4
- 帧内预测:16x16 (4种模式), 8x8 (9种), 4x4 (9种)
H.264支持最多 16个参考帧,运动矢量精度达到 1/4像素。
2.2 H.265:从宏块到CTU + CU/PU/TU三层划分
H.265抛弃了固定16x16的宏块概念,引入了编码树单元(CTU, Coding Tree Unit) ,尺寸最大可达64x64。
每个CTU通过四叉树递归划分成编码单元(CU) :

每个CU再分成预测单元(PU) (运动补偿的粒度)和变换单元(TU) (DCT变换的粒度)。CU/PU/TU三层分离是H.265的核心设计之一。
H.265的帧内预测从H.264的9种扩展到 33种角度模式 + DC + Planar = 35种。
2.3 AV1:更灵活的块划分
AV1吸收了两者的经验,块划分自由度更高。最小4x4,最大128x128的Superblock:
AV1块划分的10种递归模式:
PARTITION_NONE PARTITION_HORZ PARTITION_VERT PARTITION_SPLIT
┌─────────┐ ┌─────────┐ ┌────┬────┐ ┌────┬────┐
│ │ │ │ │ │ │ │ │ │
│ │ ├─────────┤ │ │ │ ├────┼────┤
│ │ │ │ │ │ │ │ │ │
└─────────┘ └─────────┘ └────┴────┘ └────┴────┘
PARTITION_HORZ_4 ... 以及AB型划分 (T/4 + 3T/4)
AV1还引入了非对称划分(AB partition) ,允许64x64的块划分为16x64 + 48x64,对运动边界有更好的适配性。
3. 帧内预测:从H.264到AV1的精度进化
帧内预测利用同一帧中已编码的相邻像素来预测当前块。
H.264帧内预测(以4x4块为例)
9种预测模式,每种方向不同:
模式0(垂直): 模式1(水平): 模式2(DC): 模式3(左下对角线):
A B C D E F G I 平均(A~D, A B C D E F G
I J K L M N O J I~L) J K L M N O
... K ...
L
预测公式简单直接——复制相邻像素值。
H.265帧内预测:33角度 + 滤波
33种角度模式覆盖了从-32到32的精细方向:
18 19 20 21 22 23 24 25 26
17 27
16 28
15 29
14 30
13 31
12 32
11 33
10 34
9 2(DC)
8 Planar
7 6 5 4 3
Planar模式生成平滑渐变,DC模式填充平均值。对相邻参考像素做强滤波和弱滤波处理,减少块效应。
AV1帧内预测:方向 + 递归
AV1将帧内预测模式扩展到 56种方向 + 5种非方向模式。这里的创新是:
- Recursive filtering:预测像素不仅依赖于边界,还依赖于同块内已预测的像素
- Paeth预测器:从三个相邻像素中取最接近趋势的一个
- Chroma from Luma (CfL) :用亮度分量做色度预测
// AV1 CfL预测的简化示意
// 利用亮度(Y)重建值预测色度(U/V)
// 1. 计算亮度子采样区域的平均值
// 2. 对亮度做线性缩放
// 3. 加上色度DC偏移
cfl_prediction[y][x] = alpha * luma_ac[y][x] + dc_offset;
// alpha 是编码端选择的缩放因子,有16种可能
4. 帧间预测与运动补偿:MV精度和参考帧管理
运动估计的基本流程
精度演进
| Codec | MV精度 | 参考帧数 | 运动补偿插值滤波器 |
|---|---|---|---|
| H.264 | 1/4像素(luma), 1/8(chroma) | 最多16 | 6-tap Wiener + bilinear |
| H.265 | 1/4像素(luma), 1/8(chroma) | 最多16(DPB + 2个参考帧列表) | 8-tap DCTIF + 4-tap平滑 |
| AV1 | 1/8像素(luma) | 最多8个参考帧(全局/复合) | 可选的2/4/6/8-tap滤波器 + Wiener + SGR |
AV1的 1/8像素精度 使运动补偿更精细,但代价是插值计算量大幅上升。
复合参考帧预测
AV1的一个关键创新是复合预测(Compound Prediction) ——用两个参考帧做加权平均预测:
加权系数可以逐像素变化(基于距离),也可以在整个块上统一。这让运动遮挡、渐变场景的编码效率明显提升。
5. 变换与量化:DCT/DST + 更细粒度的量化控制
H.264:4x4整数DCT
H.264用整数DCT近似变换,避免了浮点精度问题:
变换矩阵 H:
[ 1, 1, 1, 1]
[ 2, 1, -1, -2]
[ 1, -1, -1, 1]
[ 1, -2, 2, -1]
正变换: Y = H × X × H^T
量化: Z = round(Y / Qstep)
量化步长Qstep在52个层级(QP 0~51)中按指数增长:Qstep ≈ 0.625 × 2^(QP/6)
QP每增加6,码率减半(大致上)。
H.265:更大规模的DCT + 4x4 DST
H.265支持 4x4, 8x8, 16x16, 32x32 四种DCT变换。
对于4x4帧内预测残差,使用离散正弦变换(DST) 代替DCT——因为帧内预测的残差向边界方向逐渐增大,DST能更好地能量集中:
4x4 DST 变换矩阵 (H.265):
[ 29, 55, 74, 84]
[ 74, 74, 0, -74]
[ 84, -29, -74, 55]
[ 55, -74, 29, -29]
// 经过缩放和取整的整数近似
AV1:更灵活的变换集
AV1支持 16种变换组合(包括DCT/DST/ADST/FlipADST/IDTX),Txfm_size从4x4到64x64。
ADST(非对称DST) 对于帧内预测残差不均匀分布的场景效果更好。Identity Transform (IDTX) 跳过变换——对某些纹理丰富区域,不变换直接编码残差反而更好。
// AV1变换选择的简化逻辑
// 对每个变换单元,尝试多种变换组合,选RD-cost最小的
// 实际编码器中用快速决策算法而不是全搜索
enum TxType {
DCT_DCT, // DCT行 + DCT列
ADST_DCT, // ADST行 + DCT列
DCT_ADST, // DCT行 + ADST列
ADST_ADST, // ADST行 + ADST列
FLIPADST_DCT,
DCT_FLIPADST,
FLIPADST_FLIPADST,
ADST_FLIPADST,
FLIPADST_ADST,
IDTX, // 跳过变换
V_DCT, // DCT行 + IDT列
H_DCT, // IDT行 + DCT列
V_ADST,
H_ADST,
V_FLIPADST,
H_FLIPADST
};
6. 环路滤波:去块效应 + SAO + CDEF + LR
压缩产生的块效应和振铃是视觉质量的主要杀手。
H.264:Deblocking Filter
H.264的去块效应滤波器(DBF)在4x4块边界上做自适应滤波。根据块类型和运动矢量差异选择滤波强度。
边界强度(BS) = 0~4:
BS=0: 不滤波(两个块非常相似)
BS=1: 弱滤波(参考帧不同但残差小)
BS=2: 中滤波(参考帧不同)
BS=3: 强滤波(帧内编码块)
BS=4: 最强滤波(帧内编码且边界在宏块边界)
滤波过程对边界两侧的2~3个像素做修正
H.265:DBF + SAO
H.265在DBF之后增加了样点自适应补偿(SAO, Sample Adaptive Offset) 。SAO有两种模式:
- EO (Edge Offset) :根据当前像素与相邻像素的关系分4类,每类加一个偏移量
- BO (Band Offset) :将像素值范围(0~255)分成32个band,对特定band的像素加偏移
SAO对平坦区域的振铃噪声改善非常明显。
AV1:DBF + CDEF + LR 三重滤波
AV1的环路滤波分三步:
- DBF → 与H.265类似的去块效应
- CDEF (Constrained Directional Enhancement Filter) → 方向性降噪
// CDEF 核心逻辑
// 1. 检测边缘方向(8个方向之一)
// 2. 沿边缘方向做低通滤波(保护边缘)
// 3. 垂直边缘方向做高通滤波(去除噪声)
// 滤波强度由编码器自适应决定
int direction = find_direction(block, 8); // 8方向检测
for each pixel p in block:
float primary = filter_primary(p, direction, strength_pri);
float secondary = filter_secondary(p, direction, strength_sec);
p = clip(p + primary + secondary, 0, 255);
- LR (Loop Restoration) → 维纳滤波器或自导滤波,恢复高频细节。以64x64/128x128为单位,选择Wiener或SGRPROJ滤波器。
LR是AV1在主观质量上超越H.265的关键之一
7. 熵编码:CABAC统一天下
| Codec | 熵编码 | 特点 |
|---|---|---|
| H.264 | CAVLC(基线) + CABAC(主档次) | CABAC比CAVLC节省10-15%码率 |
| H.265 | CABAC only | 上下文模型更精确,概率更新自适应 |
| AV1 | 多符号算术编码(Multi-symbol Arithmetic Coding) | 支持3-5个符号的联合编码,非二元 |
H.265的CABAC相比H.264,上下文模型数量从约460个增加到约1200个。上下文越精确,概率预测越准,压缩率越高。
AV1的多符号算术编码允许一次处理多个符号(例如一次编码[0, 1, 2, 3]而不是逐bit编码),减少了算术编码器的调用次数,而且压缩率更高。
8. 工程选型实战
场景1:直播(低延迟场景)
| 需求 | 推荐Codec | 理由 |
|---|---|---|
| 延迟 < 200ms | H.264 | 编码器成熟、硬件编码器几乎全平台支持 |
| 有带宽预算 | H.265 | 50%码率节省,移动端硬解已普及 |
| 极致画质/低码率 | AV1 | Netflix旗舰画质流,但编码延迟不可控 |
直播推荐组合:
- 软件编码:x264 medium preset / x265 medium preset
- 硬件编码:NVENC H.264 (P5/P6) / QSV H.265
- 避免在直播场景用AV1软件编码,延迟太大
场景2:点播(VOD场景)
VOD编码Pipeline示例:
原始文件(ProRes/DNxHD)
│
├── H.264 基准版 (1080p, 5Mbps) → 老设备兼容
├── H.265 主版 (1080p, 3Mbps) → 主流观看
└── AV1 旗舰版 (1080p, 1.5Mbps) → 带宽优化
每个版本分4-6个码率档次,HLS/DASH自适应流
场景3:嵌入式/硬件受限
| 平台 | Codec | 参考实现 |
|---|---|---|
| ARM Cortex-A系列 | H.264/H.265 | 硬件MFC/VideoCore编码器 |
| RISC-V | H.264 | 软件编码,实时720p@30fps是上限 |
| FPGA | 取决于逻辑门数 | 通常H.264 Baseline |
| DSP | H.264 | TI C66x等 |
编码器调参经验
x264关键参数(按重要性排序):
# 高质量VOD编码
x264 --preset slower \
--crf 18 \
--profile high \
--level 4.1 \
--ref 8 \
--bframes 8 \
--b-adapt 2 \
--direct auto \
--me umh \
--subme 10 \
--trellis 2 \
--aq-mode 3 \
--aq-strength 0.8 \
--deblock -2:-2 \
-o output.h264 input.y4m
# 直播编码(低延迟)
x264 --preset veryfast \
--tune zerolatency \
--crf 22 \
--profile baseline \
--bframes 0 \
--sync-lookahead 0 \
--rc-lookahead 0 \
-o output.h264 input.y4m
CRF vs CBR vs VBR:
CRF (Constant Rate Factor):
- 固定质量,可变码率
- 最适合VOD
- 值越低质量越高:18 ≈ 视觉无损,23 ≈ 良好,28 ≈ 可接受
CBR (Constant Bitrate):
- 固定码率,质量波动
- 直播强制要求
- 过大导致垃圾数据填充(padding),过小导致画质崩溃
VBR (Variable Bitrate):
- 设定目标码率但允许波动
- 折中方案
- * 2-pass VBR是VOD的最佳码率控制模式
9. 专利与许可:工程选型不能回避的问题
这个现实问题会影响选型决策:
H.264 (AVC):
- MPEG LA专利池
- 大部分设备已预交专利费(电视、手机、GPU)
- 互联网分发需要单独考虑(但大部分情况设备端已解决)
H.265 (HEVC):
- 多个专利池:MPEG LA, HEVC Advance, Velos Media
- 专利费高于H.264
- 这是阻碍H.265大规模替代H.264的主要原因之一
AV1:
- 开源免专利费(AOM成员贡献的专利不可追溯)
- Cisco/Google/Netflix/Mozilla等支持
- AOM成员可以使用专利库中的专利抵抗非成员的专利诉讼
- * 注意:Sisvel等非AOM成员可能持有相关专利
实际建议:
- 终端产品(硬件):H.264最安全
- 服务端编码(软件):AV1是长期趋势,短期先用H.265过渡
- 如果产品面向海外:特别关注H.265专利风险(HEVC Advance的费率)
总结
没有任何Codec是银弹。H.264靠生态和成熟度统治,H.265在带宽和画质的平衡点上最优,AV1代表了免专利费和高压缩率的方向。工程选型的核心是在你的具体约束条件下找到最优解——不是技术最先进的那个,而是最"够用"的那个。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)