结论先行:FFmpeg视频压缩有三种码率控制模式——CRF(恒定画质)适合归档和本地存储,CBR(恒定码率)适合直播推流,VBR(可变码率)适合流媒体点播。同一个1080p视频,CRF 23输出42MB画质最优,CBR 4Mbps输出38MB码率最稳定,VBR输出36MB体积最小但画质波动。选错模式不是体积浪费就是画质下降,下面从原理、命令、实测三个层面详解怎么选。
如果你对视频压缩的整体方法还不太熟悉,建议先阅读视频压缩指南。
一、三种码率模式原理对比
视频编码的码率控制模式决定了编码器如何分配比特资源。不同模式的核心差异在于"优先保证什么"——CRF优先保证画质、CBR优先保证码率稳定、VBR在两者间折中。理解这三种模式的原理,是做好视频压缩的基础。
| 对比维度 | CRF (Constant Rate Factor) | CBR (Constant Bitrate) | VBR (Variable Bitrate) |
|---|---|---|---|
| 中文全称 | 恒定速率因子 | 恒定码率 | 可变码率 |
| 核心目标 | 画质恒定 | 码率恒定 | 体积可控 |
| 码率分配 | 按画面复杂度动态分配 | 每帧固定码率 | 在上下限间波动 |
| 画质一致性 | ★★★★★ | ★★☆☆☆ | ★★★☆☆ |
| 体积可控性 | ★★☆☆☆ | ★★★★★ | ★★★★☆ |
| 编码速度 | 中等 | 最快 | 较慢 |
| 适用场景 | 归档/本地存储 | 直播推流 | 流媒体点播 |
简单来说:CRF让编码器"根据画面难易程度分配码率"——动作大片多给码率、静态对话少给码率,最终每帧画质一致;CBR则"不管画面复杂与否都给一样多的码率"——简单场景浪费码率、复杂场景码率不够导致马赛克;VBR介于两者之间,设定码率范围让编码器自行调节。
二、FFmpeg命令示例与参数
三种模式在FFmpeg中的命令写法不同,关键参数也不同。下面给出每种模式的标准命令模板和参数说明。
| 模式 | 关键参数 | 参数说明 | 典型值范围 |
|---|---|---|---|
| CRF | -crf | 画质因子,值越小画质越高 | 0-51(18-28常用) |
| CRF约束 | -maxrate / -bufsize | 限制峰值码率 | maxrate 2-8Mbps |
| CBR | -b:v / -minrate / -maxrate | 三者设为相同值实现CBR | 2-8Mbps |
| VBR | -b:v | 目标平均码率 | 2-6Mbps |
| VBR范围 | -minrate / -maxrate | 码率波动范围 | min 1-2Mbps / max 4-8Mbps |
| 通用 | -preset | 编码速度与压缩率平衡 | ultrafast-fast-medium-slow |
1. CRF模式命令
CRF是最推荐的归档压缩模式。编码器根据画面复杂度自动分配码率,保证每帧画质一致。CRF 23是H.264的默认值,适合大多数场景。
纯CRF模式(不限码率上限):
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
约束CRF模式(限制峰值码率,适合需要码率上限的场景):
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M -preset medium output.mp4
2. CBR模式命令
CBR通过将minrate、maxrate和b:v设为相同值来实现恒定码率。直播推流必须用CBR保证码率稳定。
标准CBR模式:
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -minrate 4M -maxrate 4M -bufsize 8M -preset fast output.mp4
直播推流模式(配合RTMP):
ffmpeg -i input.mp4 -c:v libx264 -b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 8000k -g 60 -preset fast -f flv rtmp://server/live/stream
3. VBR模式命令
VBR设定目标平均码率,编码器在范围内自由调节。适合流媒体点播等需要体积预估的场景。
标准VBR模式:
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -preset medium -c:a aac -b:a 128k output.mp4
两遍编码VBR(Two-pass,更精确控制体积):
ffmpeg -y -i input.mp4 -c:v libx264 -b:v 4M -pass 1 -an -f mp4 /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -pass 2 -c:a aac -b:a 128k output.mp4
三、实测数据:同视频三种模式对比
我们用同一段1080p/30fps测试视频(原始体积350MB,H.264编码,时长5分钟),分别用三种模式压缩,对比体积、画质和编码耗时。
| 模式 | 参数 | 输出体积 | 压缩率 | 画质评分 | 编码耗时 |
|---|---|---|---|---|---|
| CRF 18 | -crf 18 -preset medium | 85.2MB | 75.7% | ★★★★★ | 142秒 |
| CRF 23 | -crf 23 -preset medium | 42.1MB | 88.0% | ★★★★☆ | 128秒 |
| CRF 28 | -crf 28 -preset medium | 22.5MB | 93.6% | ★★★☆☆ | 115秒 |
| CBR 4M | -b:v 4M -minrate 4M -maxrate 4M | 38.3MB | 89.1% | ★★★☆☆ | 98秒 |
| CBR 2M | -b:v 2M -minrate 2M -maxrate 2M | 19.4MB | 94.5% | ★★☆☆☆ | 92秒 |
| VBR 4M | -b:v 4M -preset medium | 36.8MB | 89.5% | ★★★★☆ | 135秒 |
| VBR 4M 两遍 | -b:v 4M -pass 2 | 36.2MB | 89.7% | ★★★★☆ | 268秒 |
实测数据揭示了几个关键结论:CRF 23在画质和体积间达到最佳平衡(42MB,画质四星半);CBR 4M体积接近CRF 23但画质略差(复杂场景出现马赛克);VBR两遍编码体积最精确但耗时翻倍。对于归档场景,CRF 23是最优选择。
再看不同preset对CRF 23的影响:
| preset | 输出体积 | 编码耗时 | 体积差异 | 推荐场景 |
|---|---|---|---|---|
| ultrafast | 58.2MB | 32秒 | +38% | 实时预览 |
| fast | 45.6MB | 68秒 | +8% | 快速压缩 |
| medium | 42.1MB | 128秒 | 基准 | 通用默认 |
| slow | 39.8MB | 285秒 | -5% | 高质量归档 |
| slower | 38.5MB | 612秒 | -9% | 极致压缩 |
不同分辨率下的推荐码率参考,帮助选择合适的CBR/VBR目标码率:
| 分辨率 | 帧率 | CBR推荐码率 | VBR目标码率 | CRF推荐值 | 适用场景 |
|---|---|---|---|---|---|
| 480p | 30fps | 1.0Mbps | 1.0Mbps | CRF 24 | 移动端低清 |
| 720p | 30fps | 2.5Mbps | 2.5Mbps | CRF 23 | 网页标准清晰度 |
| 1080p | 30fps | 4.0Mbps | 4.0Mbps | CRF 23 | 高清通用 |
| 1080p | 60fps | 6.0Mbps | 6.0Mbps | CRF 22 | 高清高帧率 |
| 1440p | 30fps | 8.0Mbps | 8.0Mbps | CRF 22 | 2K画质 |
| 2160p(4K) | 30fps | 16.0Mbps | 16.0Mbps | CRF 20 | 超高清归档 |
四、场景推荐:不同用途选不同模式
不同使用场景对画质、体积、码率稳定性的要求不同,选择码率模式的核心是匹配场景需求。
| 使用场景 | 推荐模式 | 推荐参数 | 选择理由 | 预期压缩率 |
|---|---|---|---|---|
| 本地归档存储 | CRF | -crf 23 -preset medium | 画质优先,体积最优 | 85%–90% |
| 高质量归档 | CRF | -crf 18 -preset slow | 接近无损,长期保存 | 70%–80% |
| 直播推流 | CBR | -b:v 4M -minrate 4M -maxrate 4M | 码率稳定,防卡顿 | 因源而定 |
| 流媒体点播 | VBR两遍 | -b:v 4M -pass 2 | 体积精确,画质均衡 | 80%–90% |
| 移动端播放 | 约束CRF | -crf 26 -maxrate 2M -bufsize 4M | 限制码率适配移动网络 | 90%–95% |
| 网页视频 | 约束CRF | -crf 24 -maxrate 3M -bufsize 6M | 平衡画质和加载速度 | 88%–92% |
| 监控录像 | CBR | -b:v 1M -minrate 1M -maxrate 1M | 恒定码率便于存储计算 | 因源而定 |
| 视频邮件 | CRF | -crf 28 -preset fast | 体积优先,画质可接受 | 93%–96% |
智压通 SmartSlim 在视频压缩时基于自研 Rust 压缩引擎,内置场景化参数库——4级压缩 x 15场景 x 5档性能 = 300组合,自动根据视频用途选择最佳码率模式和参数,无需手动调FFmpeg命令。企业用户还可通过SDK集成到业务系统中,实现视频压缩自动化。
更多视频编码对比,可以参考H.264 vs H.265 vs AV1编码对比和视频压缩画质评估方法。
五、常见问题FAQ
Q1:FFmpeg视频压缩用CRF还是VBR好?
归档和本地存储用CRF更好。CRF以恒定画质为目标,复杂场景多分配码率、简单场景少分配,画质一致且体积最优。推荐CRF值18-28,18接近视觉无损,23是默认平衡点,28画质可接受但体积更小。VBR适合需要控制码率上限的场景如流媒体,但画质不如CRF稳定。
Q2:CRF值多少画质最好?
CRF值越小画质越高,体积越大。H.264编码下:CRF 0为无损,CRF 18接近视觉无损(体积约为原片的50%),CRF 23是FFmpeg默认值(体积约原片的25%),CRF 28画质可接受(体积约原片的12%)。推荐范围18-28,大多数场景用CRF 23即可,追求高质量用CRF 18-20。
Q3:直播推流应该用CBR还是VBR?
直播推流推荐用CBR。直播对码率稳定性要求极高——CBR保持恒定码率,避免网络波动导致卡顿。推流平台通常要求固定码率(如Twitch 6000kbps,B站 4000kbps),CBR能精确匹配。VBR在复杂场景可能码率飙升超出带宽上限导致丢帧,CBR则始终稳定。建议推流用CBR + maxrate = bufsize = 目标码率。
Q4:FFmpeg两种VBR模式有什么区别?
FFmpeg有两档VBR:-crf配合maxrate/bufsize是约束VBR(constrained VBR),画质接近纯CRF但限制码率峰值;-b:v配合-minrate/-maxrate是传统VBR,码率在范围内波动。约束VBR更适合实际使用,既保证画质又控制峰值码率。传统VBR适合需要精确控制码率范围的场景,如适配特定带宽环境。
总结
FFmpeg三种码率模式各有最佳场景:CRF优先画质适合归档(推荐CRF 23),CBR优先稳定适合直播推流(推荐4Mbps恒定),VBR优先体积可控适合流媒体点播(推荐两遍编码)。选对模式是视频压缩的第一步——归档选CRF、直播选CBR、点播选VBR,记住这个原则就不会出错。
如果不想手动写FFmpeg命令,智压通 SmartSlim 提供开箱即用的视频压缩方案,基于自研 Rust 压缩引擎内置300种场景化参数组合,支持 mp4/mkv/avi/mov/wmv/flv/webm/m4v 等 8 种视频格式,本地压缩数据不出域。