~/blog/crf-explained
编码2026-08-24 · 6 min

CRF 到底是什么?视频压缩质量参数完全拆解

同样一个 -crf 参数,为什么 23 和 28 的体积能差一倍?从 x264 的码控模型讲起,给你一张可以直接照抄的 CRF 选择速查表。

同样一个 -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 管"愿意花多少时间换取同等质量下的更小体积"

  • ultrafastmediumveryslow:编码速度递减,同画质体积递减
  • 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 是另一套编码体系,压缩思路完全不同(减色、抽帧、无损优化)。

RELATED TOOLS · 把文章里的东西用起来