性能优化:多线程设置、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、码率控制三者如何协同工作。
五、实战组合建议
说了这么多,到底怎么选?我给你几个现成的组合,直接拿去用。
- 日常转码(兼顾速度与质量):
-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秒)做测试,调好参数再跑全片。这样省时省力,还不容易翻车。