同样一个 -crf 23,为什么有的视频压出来 200MB、有的只有 100MB?为什么网上都说 CRF 23 是"默认画质",你的视频用它却糊得没法看?这篇文章从 x264 的码控模型讲起,把 CRF 讲透,最后给你一张可以直接照抄的速查表。
CRF 不是码率,是"质量目标"
FFmpeg 压视频有两条完全不同的路:
恒定码率(CBR):不管画面是静止的黑屏还是高速运动的爆炸场面,每秒都给同样的比特数。静止画面浪费码率,运动画面码率不够糊成马赛克。
CRF(Constant Rate Factor,恒定速率因子):反过来——先定一个"质量目标",编码器根据画面复杂度自动分配码率。画面简单就少给比特,画面复杂就多给。结果是:画质恒定,体积浮动。
# CRF 模式:只给质量,不给码率
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
# 对比:CBR 模式(仅做对照,一般不推荐)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M output.mp4
这就是为什么同样的 -crf 23,压动漫和压实拍运动视频,体积能差好几倍——CRF 的输出体积取决于内容,这是特性不是 bug。
数值范围:越小越清晰,越大体积越小
x264 的 CRF 取值 0–51,0 等价于无损,51 接近不可看。每个 +6 大约让码率减半,每个 -6 大约翻倍:
| CRF | 画质感受 | 典型用途 |
|---|---|---|
| 0 | 无损 | 中间处理、素材保存 |
| 16–18 | 视觉无损(放大对比才能看出差异) | 高质量存档 |
| 20–23 | 高质量,默认区间 | 日常转码、发布视频 |
| 24–27 | 可感知轻微损失,体积明显下降 | 网盘备份、不重要的分享 |
| 28–35 | 明显压缩痕迹 | 草稿预览 |
| 36+ | 糊 | 基本没有合理用途 |
x264 的默认值是 23。也就是说,什么都不填的时候,FFmpeg 用的就是 -crf 23。
x265 的数字不能照搬
x265(HEVC)的 CRF 同样是 0–51,但刻度完全不同——x265 的 28 大约对应 x264 的 23。把 x264 的习惯参数原样抄给 x265,会得到体积小很多但画质也明显下降的文件:
# x265 想达到 x264 -crf 23 的观感,大约要用 -crf 28
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
同理,如果你从 x265 迁回 x264,记得把数值下调 5 左右。
场景速查表
不想理解原理的话,照抄即可(以 x264 为准):
| 场景 | 推荐 CRF | 说明 |
|---|---|---|
| 手机/相机录制转存 | 18–20 | 保住细节,体积可控 |
| B 站/YouTube 上传 | 18–21 | 平台会二压,上传越清晰越好 |
| 微信/邮件分享 | 23–26 | 体积优先,能看清就行 |
| 老视频抢救性存档 | 16–18 | 一次投入,长期受益 |
| 屏幕录制教程 | 16–20 | 文字对压缩损失非常敏感 |
屏幕录制单独提醒一句:白底黑字的大面积文字对 x264 来说是"高频细节",压缩损失最先体现在文字边缘发糊上,所以录屏宁可 CRF 给低一点,也不要事后补救。
CRF 和 preset 是两件事
很多人把这两个混在一起。CRF 管"要多少质量",preset 管"愿意花多少时间换取同等质量下的更小体积":
ultrafast→medium→veryslow:编码速度递减,同画质体积递减- preset 不影响画质基准,只影响压缩效率
# 速度与体积的平衡点,大多数场景够用
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset fast output.mp4
# 不赶时间、追求体积(如存档)
ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset veryslow output.mp4
实操建议:先用 -preset fast 试出满意的 CRF 值,最终输出时再换成更慢的 preset——两者可以独立调整。
常见误区
"CRF 23 就是 23 Mbps" —— 不是。CRF 与码率没有直接换算关系,输出码率完全由内容复杂度决定。
"CRF 越低永远越好" —— 不是。CRF 18 之后肉眼看不出差别,再降只是白白浪费体积;播放器解码高码率文件还可能卡顿。
"压一遍不满意再压一遍" —— 有损编码叠加有损编码,画质损失会累积。尽量从原始素材一次压到位,二次压缩要重新评估 CRF。
"改了 CRF 体积没变化" —— 检查是不是忘了指定 -c:v libx264(或被预设覆盖成了别的编码器),不同编码器的 CRF 语义完全不同。
动手试
参数的最终裁判是你的眼睛和你的目标体积。打开视频压缩工具,浏览器里直接调节 CRF 对比几组输出;如果想精确控制包括 preset 在内的全部参数,去 FFmpeg 命令实验室试跑完整命令——都是本地处理,不排队也不上传。
FAQ
Q:CRF 压完体积比原文件还大怎么办? A:说明原文件本身码率低于 CRF 目标质量所需的码率(典型:手机随手拍)。此时再压不会更小只会更糊,正确做法是提高 CRF 数值或降低分辨率。
Q:-crf 和 -qp 有什么区别?
A:-qp 是固定量化参数,完全不看画面内容;CRF 在 qp 基础上按人眼感知模型做了自适应调整,除非你在做逐帧调试,否则一律用 CRF。
Q:GIF 也能用 CRF 吗? A:不能。CRF 是 H.264/H.265 这类视频编码的概念,GIF 是另一套编码体系,压缩思路完全不同(减色、抽帧、无损优化)。