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 的关系:
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%,质量几乎不变。这些微调技巧,咱们后面的章节会逐个拆解。