性能优化:多线程设置、preset选择、码率控制模式

这一章,我们来聊聊编码时的“调优三板斧”。说白了,就是怎么让FFmpeg跑得更快,同时输出质量还能让人满意。我见过不少新手,上来就怼一个默认参数,结果要么慢得离谱,要么文件大得吓人。嗯,今天咱们就把这几个核心点掰开揉碎。

一、多线程设置:别让CPU闲着

现代CPU都是多核的。你想想看,如果只用一个核心干活,其他核心在旁边围观,那多浪费。FFmpeg支持多线程编码,能显著提升速度。

关键参数:

  • -threads N:指定使用N个线程。N一般设为CPU物理核心数。
  • -thread_type slice 或 frame:控制线程的划分方式。

我的经验:我个人习惯把线程数设为物理核心数,而不是逻辑核心数。比如4核8线程的CPU,我设-threads 4。设太多反而会因为线程切换开销导致性能下降。

示例:

ffmpeg -i input.mp4 -c:v libx264 -threads 4 -thread_type frame output.mp4

小技巧:如果你不确定CPU核心数,可以用-threads auto让FFmpeg自动检测。但说实话,自动检测有时不准,我建议手动指定。

二、Preset选择:速度与质量的博弈

Preset,说白了就是预设的“编码策略”。FFmpeg提供了从ultrafast到placebo共10个级别。速度越快,压缩率越低(文件越大);速度越慢,压缩率越高(文件越小,质量越好)。

常用preset对比:

Preset 编码速度 输出文件大小 适用场景
ultrafast 极快 很大 实时推流、测试
veryfast 很快 较大 日常快速转码
fast 快 中等偏大 一般用途
medium 中等 中等 默认值,平衡之选
slow 慢 较小 高质量存档
veryslow 很慢 很小 追求极致压缩
placebo 极慢 极小 几乎不用,收益极低

避坑指南:我曾经为了省空间,用placebo压一个10分钟的短片,结果跑了整整一个下午。最后文件只比veryslow小了不到5%。从那以后,我再也没用过placebo。说白了,收益和付出不成正比。

示例:

# 快速转码,适合预览
ffmpeg -i input.mp4 -c:v libx264 -preset veryfast output.mp4

# 高质量存档,适合最终成品
ffmpeg -i input.mp4 -c:v libx264 -preset slow output.mp4

三、码率控制模式:CRF / CBR / VBR

码率控制,就是决定“每一帧分多少比特”。三种模式各有千秋,我一个个说。

1. CRF(恒定质量)

这是我最常用的模式。你指定一个质量值(0-51,越低质量越好),编码器自动分配码率。简单粗暴,效果很好。

  • 参数:-crf 23(默认23,18-28是常用范围)
  • 特点:输出文件大小不可控,但质量恒定。
  • 适用:本地存档、个人项目。

我的习惯:对于1080p视频,我一般用-crf 20。视觉上几乎无损,文件大小也能接受。如果是4K,我会降到-crf 22,因为分辨率高了,码率需求反而没那么敏感。

示例:

ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset slow output.mp4

2. CBR(恒定码率)

码率全程固定,不波动。适合直播、视频会议等对带宽要求严格的场景。

  • 参数:-b:v 2M -minrate 2M -maxrate 2M -bufsize 4M
  • 特点:文件大小可精确预测,但质量不稳定(复杂场景会糊)。
  • 适用:直播、IPTV。

小提示:CBR模式下,-bufsize一般设为码率的2倍。比如码率2M,bufsize设4M。这样编码器有缓冲余地,不会突然卡顿。

示例:

ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -minrate 2M -maxrate 2M -bufsize 4M output.mp4

3. VBR(可变码率)

码率在指定范围内波动。复杂场景给更多码率,简单场景给更少。这是质量和文件大小的折中方案。

  • 参数:-b:v 2M -maxrate 4M -bufsize 6M
  • 特点:质量比CBR好,文件大小比CRF可控。
  • 适用:网络分发、流媒体平台。

避坑指南:我曾经给一个客户做VBR编码,设了-maxrate太高,结果上传到平台后被二次压缩,画质反而变差了。后来我学乖了,VBR的-maxrate一般设为-b:v的1.5到2倍,别太贪心。

示例:

ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 3M -bufsize 4M output.mp4

四、知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以看到,多线程、preset、码率控制三者如何协同工作。

FFmpeg 编码性能优化核心逻辑 原始视频 多线程设置 -threads N / -thread_type Preset 选择 ultrafast ~ placebo 码率控制 CRF / CBR / VBR 编码后视频 速度 ↑ 质量 ↑ 文件大小 ↓

五、实战组合建议

说了这么多,到底怎么选?我给你几个现成的组合,直接拿去用。

  • 日常转码(兼顾速度与质量):-preset medium -crf 23 -threads 4
  • 高质量存档(慢但好):-preset slow -crf 18 -threads 4
  • 直播推流(码率可控):-preset veryfast -b:v 2M -minrate 2M -maxrate 2M -bufsize 4M -threads 2
  • 网络分发(VBR折中):-preset fast -b:v 1.5M -maxrate 2.5M -bufsize 3M -threads 4

最后说一句:没有万能参数。每个项目都有自己的脾气。我建议你拿到一个视频后,先切一小段(比如30秒)做测试,调好参数再跑全片。这样省时省力,还不容易翻车。

公众号:蓝海资料掘金营,微信deep3321