4. 编码参数调优(上):预设(preset)与调优(tune)详解、码率控制模式(CBR/VBR/CRF)选择

编码参数调优,说白了就是跟编码器“讨价还价”。你想让它跑快点,它就得牺牲画质;你想让它压得小,它就得花更多时间。这中间的门道,全在 preset 和 tune 这两个参数里。

我刚开始接触 H.265 编码时,总觉得参数越多越好。后来踩了不少坑才明白——选对参数,比堆参数重要得多。

4.1 预设(Preset)——速度与压缩率的博弈

Preset 是编码器内置的一套“策略模板”。它决定了编码器在编码速度和压缩效率之间如何取舍。

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

预设等级 相对速度 压缩率提升 典型场景
ultrafast 最快 基准 实时预览、调试
superfast 极快 +5% 低延迟直播
veryfast 很快 +10% 快速转码
faster 较快 +15% 日常批量处理
fast 中等偏快 +20% 点播转码
medium 中等 +25% 默认值,通用场景
slow 较慢 +35% 高质量存档
slower 慢 +45% 高压缩率需求
veryslow 很慢 +55% 极限压缩
placebo 最慢 +60% 几乎不用,收益极低

核心结论:从 medium 到 slow 是性价比最高的区间。再往下走,时间翻倍,压缩率提升却越来越小。

我在项目中遇到过一件事:有个同事为了省存储,把所有视频都用了 veryslow 预设。结果一个 2 小时的 4K 视频,编码跑了整整 8 个小时。最后算下来,比 slow 预设只多省了 3% 的码率。你说值不值?

4.2 调优(Tune)——为特定场景“定制”编码器

Tune 是在 preset 基础上,针对特定内容类型做的微调。它告诉编码器:“嘿,这段视频是动画,别用运动估计那套算法了。”

x265 支持的 tune 选项:

  • psnr:以峰值信噪比为优化目标,适合客观质量评测
  • ssim:以结构相似性为优化目标,更接近人眼感知
  • grain:保留胶片颗粒感,适合电影、老片源
  • fastdecode:牺牲压缩率换取解码速度,适合低端设备播放
  • zerolatency:零延迟模式,适合视频会议、直播
  • animation:针对卡通、动画内容优化

我的习惯:做点播转码时,我一般不加 tune,让编码器自己判断。但遇到动画片源,我一定会加 --tune animation,效果立竿见影。

你想想看,动画片里大块纯色区域多,运动边缘清晰。如果用默认的运动估计,反而会浪费码率去处理那些“假纹理”。--tune animation 会调整量化参数,让平坦区域更平滑,边缘更锐利。

4.3 码率控制模式——CBR、VBR、CRF 怎么选?

码率控制,就是决定“每秒钟给视频分配多少比特”。选错了,要么画面糊成一片,要么文件大得离谱。

4.3.1 CBR(恒定码率)

输出码率始终保持在设定值附近,波动很小。

  • 优点:带宽可控,适合直播、视频会议
  • 缺点:复杂场景画质下降明显,简单场景浪费码率
  • 命令示例:--bitrate 5000 --vbv-maxrate 5000 --vbv-bufsize 5000

避坑指南:我曾经在一个直播项目里用了 CBR,结果画面剧烈运动时全是马赛克。后来加了 --vbv-bufsize 参数,允许短时间码率波动,才解决了问题。

4.3.2 VBR(可变码率)

允许码率在一定范围内波动,复杂场景多用码率,简单场景少用。

  • 优点:画质更稳定,文件大小可控
  • 缺点:峰值码率可能超出预期
  • 命令示例:--bitrate 5000 --vbv-maxrate 8000 --vbv-bufsize 6000

说白了,VBR 是 CBR 和 CRF 之间的折中方案。你设一个目标码率,再设一个上限,编码器在两者之间自由发挥。

4.3.3 CRF(恒定质量)

这是我最常用的模式。它不关心码率,只关心感知质量。

  • 优点:画质恒定,一次编码搞定
  • 缺点:输出文件大小不可控
  • 命令示例:--crf 23

CRF 的取值范围是 0~51,数值越小质量越高。我个人习惯:

  • CRF 18~20:视觉无损,适合存档
  • CRF 23~25:高质量,适合点播
  • CRF 28~30:可接受质量,适合移动端

重要提醒:CRF 模式下,--vbv-maxrate 和 --vbv-bufsize 依然有效。如果你需要限制峰值码率,可以同时使用。

4.4 知识体系总览

下面这张图,把 preset、tune 和码率控制的关系梳理清楚了:

H.265 编码参数调优知识体系 H.265 编码参数调优知识体系 Preset(预设) Tune(调优) 码率控制 预设等级(10级) ultrafast → superfast → veryfast faster → fast → medium slow → slower → veryslow placebo(几乎不用) 速度 ↑ 压缩率 ↓ 场景优化选项 psnr / ssim(客观质量) grain(保留胶片颗粒) fastdecode(快速解码) zerolatency(零延迟) animation(动画优化) 三种模式 CBR:恒定码率,带宽可控 VBR:可变码率,画质稳定 CRF:恒定质量,文件大小不定 推荐:CRF 23 + vbv 限制 选择策略:先定 preset → 再选 tune → 最后确定码率控制模式 实践建议 • 点播转码:preset=slow, tune=不指定, crf=23 • 直播推流:preset=veryfast, tune=zerolatency, cbr • 存档备份:preset=slower, crf=18

4.5 实战组合推荐

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

场景 Preset Tune 码率控制 备注
1080p 点播 slow 不指定 CRF 23 通用配置,画质与体积平衡
4K 存档 slower 不指定 CRF 18 视觉无损,保留细节
直播推流 veryfast zerolatency CBR 5000k 低延迟,码率稳定
动画转码 medium animation CRF 25 节省码率,边缘清晰
移动端点播 fast fastdecode CRF 28 降低解码压力

我的建议:别一上来就追求“最佳参数”。先拿一小段素材跑几组对比,看看实际效果。毕竟,参数是死的,你的业务场景才是活的。