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

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

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

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

关键参数:

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

我的经验:我个人习惯把线程数设为物理核心数,而不是逻辑核心数。比如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提供了从ultrafastplacebo共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