4. 预设与调优:preset 参数详解与 tune 参数实战

说到 H.265 编码,preset 和 tune 这两个参数,我敢说每个用 x265 的人都绕不开。它们就像编码器的两把钥匙——一把决定速度与压缩率的平衡,另一把决定编码器该为哪种场景服务。

今天咱们就把这两个参数彻底聊透。我会结合自己踩过的坑,告诉你什么时候该用 ultrafast,什么时候该上 placebo,以及 tune 参数到底能不能帮你省时间。

4.1 preset 参数:从 ultrafast 到 placebo 的完整图谱

x265 提供了 10 个预设等级,从最快到最慢依次是:

预设名称 相对速度 典型压缩率提升 我常用的场景
ultrafast 最快 基准(0%) 实时预览、直播推流
superfast 极快 约 5-10% 快速转码测试
veryfast 很快 约 10-15% 日常批量处理
faster 较快 约 15-20% 中等质量需求
fast 快 约 20-25% 通用场景
medium 中等 约 25-30% 默认值,平衡之选
slow 较慢 约 30-35% 高质量存档
slower 慢 约 35-40% 离线压制
veryslow 很慢 约 40-45% 最终交付版
placebo 最慢 约 45-50% 几乎不用,除非...

你可能会问:为什么 placebo 比 veryslow 只多 5% 的压缩率,速度却慢了好几倍?

嗯,这里有个关键点。preset 越慢,编码器会尝试越多的运动估计模式、越精细的块划分、越多的参考帧组合。但到了 veryslow 之后,边际收益急剧下降。placebo 这个名字本身就带点讽刺意味——它追求的是理论上的极致,实际收益微乎其微。

核心结论:从 slow 到 veryslow 是性价比最高的区间。我个人习惯把 medium 作为调试起点,最终交付用 slow 或 slower。placebo?我只有在做学术对比测试时才用过两次。

4.2 preset 背后的关键开关

每个 preset 其实是一组参数的集合。我拆几个最重要的给你看:

  • ctu(编码树单元大小):ultrafast 固定用 64x64,placebo 会尝试 16x16 到 64x64 所有组合。
  • ref(参考帧数量):ultrafast 只用 1 帧,placebo 用到 16 帧。参考帧越多,运动估计越准,但内存和耗时也线性增长。
  • subme(亚像素精度):从 0(最粗糙)到 7(最精细)。ultrafast 用 0,placebo 用 7。
  • me(运动估计算法):ultrafast 用 dia(菱形搜索),placebo 用 star(星形搜索)+ 全搜索。
  • rd(率失真优化深度):从 0 到 6,数值越高,编码器对每个块的决策越精细。

举个例子,你执行这条命令:

ffmpeg -i input.mp4 -c:v libx265 -preset slow -x265-params "ref=4:subme=5" output.mp4

这相当于在 slow 预设基础上,手动把参考帧降到 4 帧、亚像素精度降到 5。速度会快一些,质量损失肉眼几乎看不出来。

我的小技巧:如果你不确定某个参数的影响,可以用 -x265-params "log-level=debug" 查看编码器实际启用了哪些开关。我曾经靠这个发现某个 preset 在特定分辨率下自动降级了参考帧数量——文档里根本没写。

4.3 tune 参数:让编码器更懂你的内容

preset 控制的是「多努力」,tune 控制的是「往哪个方向努力」。x265 支持以下几种 tune:

tune 名称 优化目标 典型场景
psnr 最大化峰值信噪比 客观质量测试、算法对比
ssim 最大化结构相似性 主观质量接近人眼感知
grain 保留胶片颗粒/噪点 电影、老片修复、动画
zerolatency 零延迟 直播、视频通话、实时监控
fastdecode 优化解码速度 低端设备播放

每个 tune 背后都有一组参数调整。我挑三个最常用的详细说说。

4.3.1 tune psnr:纯数字游戏

PSNR 是逐像素对比的数学指标。tune psnr 会让编码器优先选择能提高 PSNR 的决策,哪怕视觉上根本看不出区别。

说实话,我在实际项目中几乎不用这个。除非客户合同里白纸黑字写了「PSNR 必须达到 XX dB」,否则 tune psnr 出来的片子往往锐化过度,看着反而不自然。

避坑指南:我曾经为了应付一个苛刻的甲方,用 tune psnr 压了一版。结果对方播放时觉得画面「太假了,像塑料」。后来换成 tune ssim,指标降了 0.3 dB,但对方说「这才对味」。所以,别迷信数字。

4.3.2 tune ssim:更接近人眼

SSIM 考虑了亮度、对比度和结构三个维度,比 PSNR 更贴近人眼感知。tune ssim 是很多视频团队的首选,尤其是做 OTT 平台和流媒体分发的时候。

它的原理是:编码器在率失真优化时,用 SSIM 代替传统的 SAD(绝对差值和)作为失真度量。说白了,就是让编码器更关注「看起来像不像」,而不是「像素差多少」。

用法很简单:

ffmpeg -i input.mp4 -c:v libx265 -preset medium -tune ssim output.mp4

4.3.3 tune grain:保留质感

这个 tune 是我个人最喜欢的。它专门解决一个经典问题:编码器会把胶片颗粒当成噪声抹掉,结果画面变得像磨皮一样光滑,失去质感。

tune grain 会做两件事:

  • 降低去噪强度(noise reduction 相关参数被削弱)
  • 在量化时保留更多高频细节(说白了就是允许码率适当增加来保留颗粒)

我处理过一部 90 年代的老电影,原片颗粒感很重。用默认 preset 压出来,画面干净得像 AI 修复过——但导演说「这不是我要的感觉」。换成 tune grain 后,颗粒保留得很好,码率只多了 8%,导演很满意。

注意:tune grain 会增加码率。如果你对文件大小有硬性要求,可以配合 -crf 适当提高 1-2 个点来补偿。比如原来用 CRF 22,改成 tune grain 后试试 CRF 23。

4.3.4 tune zerolatency:直播必备

zerolatency 关闭了所有引入延迟的特性:

  • 禁用 B 帧(B 帧需要未来帧做参考)
  • 禁用 lookahead(预分析)
  • 禁用帧级并行
  • 强制使用低延迟的码率控制

我做过一个远程手术示教的项目,延迟要求低于 200ms。当时用的就是 -preset ultrafast -tune zerolatency,配合 CBR 码率控制。画面质量虽然一般,但延迟稳稳控制在 150ms 以内。

ffmpeg -i input.mp4 -c:v libx265 -preset ultrafast -tune zerolatency -x265-params "vbv-maxrate=2000:vbv-bufsize=2000" output.ts

4.4 知识体系总览

下面这张图帮你理清 preset 和 tune 的关系:

Preset 与 Tune 参数关系图 Preset 与 Tune 参数关系图 Preset(预设) ultrafast ~ fast medium ~ slow slower ~ veryslow placebo 控制 x265 编码器核心 Tune(调优方向) psnr ssim grain zerolatency fastdecode 核心逻辑: Preset 决定「多努力」,Tune 决定「往哪努力」。两者正交,可以组合使用。

4.5 实战组合建议

说了这么多,直接给几个我常用的组合拳:

  • 直播推流:-preset ultrafast -tune zerolatency,配合 CBR 码率控制。别想太多,延迟第一。
  • 日常存档:-preset slow -tune ssim,CRF 22-24。画质和体积的黄金平衡点。
  • 电影/纪录片:-preset slower -tune grain,CRF 20-22。保留质感,码率适当放宽。
  • 移动端分发:-preset medium -tune fastdecode,配合 -profile:v main。降低解码复杂度,省电省性能。
  • 客观测试:-preset veryslow -tune psnr。跑分专用,别拿这个压片给人看。

最后说一句:preset 和 tune 只是起点。真正的高手会在预设基础上微调具体参数。比如我经常在 slow 预设基础上把 subme 从 5 降到 4,速度能快 15%,质量几乎不变。这些微调技巧,咱们后面的章节会逐个拆解。