第三章 主流编码器详解:从 H.264 到 AV1

编码器,说白了就是流媒体系统的「心脏」。你推流再快、网络再好,编码器不给力,画面全是马赛克,用户照样骂娘。我这些年调过的编码器少说也有几十种,从硬件编码器到纯软件实现,踩过的坑能写满一个笔记本。今天咱们就把 H.264、H.265 和 AV1 这三兄弟掰开揉碎了讲清楚。

核心观点:没有最好的编码器,只有最适合场景的编码器。低延迟场景下,编码器的选择直接影响端到端延迟 30%-50%。

3.1 H.264/AVC:老将出马,一个顶俩

H.264 发布于 2003 年,到现在二十多年了,依然是流媒体领域使用最广泛的编码标准。为什么?兼容性好,几乎所有设备都支持。我在做直播项目时,第一版用的就是 H.264,因为要兼容用户手里的各种老旧手机。

编码器结构

H.264 编码器核心结构可以概括为「五步走」:

  1. 帧内预测:利用当前帧已编码的像素预测当前块,去除空间冗余
  2. 帧间预测:参考前后帧的运动补偿,去除时间冗余
  3. 变换量化:对残差做 DCT 变换,再量化压缩
  4. 熵编码:用 CAVLC 或 CABAC 把数据压缩成比特流
  5. 环路滤波:去块效应滤波,提升主观画质
H.264 编码器核心流程 输入帧 帧内/帧间预测 变换 + 量化 熵编码 输出码流 环路滤波 说明:环路滤波后的重建帧会作为后续帧的参考帧,形成闭环。这也是 H.264 编码器「有损」的关键环节。

常用配置参数

实际项目中,我一般用 x264 这个开源实现。它的参数体系很成熟,但新手容易懵。我挑几个最关键的说说:

参数 作用 推荐值(低延迟)
preset 编码速度与压缩率的权衡 veryfast 或 faster
tune 针对特定场景优化 zerolatency
profile 编码特性集 baseline(兼容性优先)
level 分辨率与码率上限 4.1(1080p 够用)

我的经验:低延迟直播场景,preset 别用 ultrafast。虽然它最快,但压缩率太差,码率会飙得很高。我一般从 veryfast 起步,如果 CPU 有余量再降到 faster。

3.2 H.265/HEVC:省一半码率,多一倍麻烦

H.265 是 H.264 的继任者,2013 年标准化。它的核心卖点很直接:同等画质下,码率比 H.264 低 40%-50%。

为什么会这样?H.265 引入了几个关键改进:

  • 更大的编码块:从 H.264 的 16x16 扩展到 64x64,对大分辨率画面更友好
  • 更精细的预测:帧内预测模式从 9 种增加到 35 种
  • 改进的运动补偿:支持 1/8 像素精度,运动估计更准
  • 并行化设计:Tile 和 WPP 技术,方便多核 CPU 加速

但 H.265 有个大问题——专利授权。我当年在一个商业项目里用 H.265,法务部门查了三个月才搞定授权费用。这也是为什么很多互联网公司转向了 AV1。

x265 配置要点

x265 是 H.265 最流行的开源实现。它的参数和 x264 类似,但多了些 HEVC 特有的选项:

# 低延迟直播配置示例
x265 --input input.yuv --output output.hevc \
     --preset veryfast \
     --tune zerolatency \
     --profile main \
     --crf 23 \
     --keyint 60 \
     --no-open-gop \
     --no-scenecut

注意:H.265 的 zerolatency tune 和 H.264 的行为不同。H.265 的 lookahead 机制默认会引入几帧延迟,必须配合 --no-scenecut 和 --no-open-gop 才能真正做到零延迟。我踩过这个坑,直播画面延迟了 3 帧,排查了半天才发现是 scenecut 在作怪。

3.3 AV1:开源之光照进现实

AV1 是 2018 年由开放媒体联盟(AOM)推出的开源编码标准。它的目标是:比 H.265 再省 30% 码率,而且完全免费。

AV1 的编码器实现主要有两个:

  • libaom:AOM 官方参考实现,压缩率最高,但编码速度慢得令人发指
  • SVT-AV1:Intel 主导的优化实现,速度比 libaom 快 5-10 倍,适合实际部署

我目前在用的主要是 SVT-AV1。它的参数设计很清晰,和 x264/x265 的哲学不太一样:

SVT-AV1 参数 对应 x264 概念 低延迟推荐值
--preset 编码速度(0-13,数字越大越快) 8 或 10
--crf 质量目标(0-63,越小质量越好) 30-35(直播场景)
--tune 优化方向 0(VQ 主观质量)
--enable-overlays 叠加层支持 0(关闭,减少延迟)

关键对比:同样 1080p@30fps 的直播流,H.264 需要 4Mbps,H.265 需要 2.5Mbps,AV1 只需要 1.8Mbps。但 AV1 的编码耗时是 H.264 的 10-20 倍。所以低延迟场景下,AV1 更适合离线转码,实时编码还得靠硬件加速。

3.4 编码器参数调优:CRF、Preset、Tune

这三个参数是编码器调优的「三驾马车」。我面试高级工程师时,必问这个问题。

CRF:质量优先模式

CRF(Constant Rate Factor)是固定质量模式。编码器会根据画面复杂度自动分配码率,简单画面少用码,复杂画面多用码。

  • 取值范围:0-51(x264),0-63(x265/SVT-AV1)
  • 常见取值:18-28。18 接近无损,28 属于中等质量
  • 低延迟场景:我一般用 23-25。太低了码率会飙,太高了画质崩

避坑指南:CRF 模式不适合带宽受限的场景。比如你给用户推 1Mbps 的流,用 CRF 23 可能实际码率跑到 3Mbps,用户全卡了。这时候应该用 --bitrate 固定码率模式。

Preset:速度与质量的博弈

Preset 控制编码器在「速度」和「压缩率」之间的取舍。x264 的 preset 从慢到快依次是:

placebo → veryslow → slower → slow → medium → fast → faster → veryfast → superfast → ultrafast

每提升一档,编码速度大约翻倍,但码率会增加 5%-10%。

我个人的经验法则:

  • 离线转码:用 slow 或 veryslow,省带宽就是省钱
  • 实时直播:用 veryfast 或 faster,延迟优先
  • 硬件编码器:preset 通常对应芯片的功耗模式,选中间档最稳妥

Tune:场景化调优

Tune 是编码器的「场景预设」。它告诉编码器:你现在要处理的是什么类型的视频?

tune 值 适用场景 效果
film 电影、电视剧 保留胶片颗粒感,提升主观画质
animation 动画、卡通 优化平坦区域,减少色块
grain 高噪点视频 保留噪点纹理,避免画面「塑料感」
zerolatency 直播、视频通话 禁用 lookahead,最小化编码延迟
fastdecode 低性能解码设备 牺牲压缩率,降低解码复杂度

我曾经犯过的错:有一次做游戏直播,画面全是快速运动的场景,我用了 tune film,结果画面糊成一团。后来换成 tune zerolatency 加上 --no-deblock,效果好了很多。记住:tune 不是万能药,要根据实际内容测试。

3.5 如何选择?一张图说清楚

说了这么多,到底该用哪个编码器?我整理了一个决策流程:

编码器选型决策流程 你的场景是什么? 实时直播 / 视频通话 设备兼容性要求高? H.264 baseline H.265 / AV1 离线转码 / VOD 带宽成本敏感? H.264 high profile AV1 (SVT-AV1) 提示:如果硬件编码器可用(如 Intel QSV、NVIDIA NVENC),优先用硬件编码器。延迟更低,CPU 占用几乎为零。

嗯,编码器这块内容确实不少。但记住一点:参数是死的,场景是活的。同样的配置,换一个内容类型,效果可能天差地别。我每次上线新业务,都会花至少一周时间做编码器参数对比测试,用 PSNR、SSIM、VMAF 这些客观指标加上主观盲测,才能确定最终方案。