视频压缩方法详解:CRF、码率控制与分辨率缩放
视频压缩方法完全指南:CRF(恒定质量因子)、CBR/VBR 码率控制和分辨率缩放。了解每种方法的原理和最佳使用场景,兼顾画质与文件大小。
深入理解 CRF 视频压缩
恒定质量因子(CRF,Constant Rate Factor)是现代视频编码器使用的一种码率控制方法,用于生成感知画质一致的输出。与以特定码率或文件大小为目标的方法不同,CRF 以画质水平为目标,让编码器自行决定每帧需要多少比特才能达到该画质。
CRF 已成为离线视频编码的默认推荐方案,因为它无需两遍编码就能实现最优的画质/比特比。如果你搜索过"FFmpeg 最佳设置"或"如何无损压缩视频",CRF 几乎一定是你找到的答案。
本指南从技术层面解释 CRF 的工作原理,将其与其他码率控制方法进行对比,并明确指出 CRF 的适用场景。实际命令行示例请参阅 FFmpeg CRF 实例指南。如果你是完全的新手,建议从 CRF 入门基础 开始。
CRF 的内部工作机制
画质定向机制
当你设定一个 CRF 值(例如 H.264 的 CRF 23)时,你实际上是在告诉编码器:"整个视频都以这个感知画质水平为目标。"编码器随后根据每帧的压缩难度来决定分配多少比特。
内部处理流程如下:
帧分析:编码器分析每帧(或每组帧)的复杂度——空间细节量、运动量,以及该帧从相邻帧预测的有效性。
量化参数(QP)选择:根据分析结果,编码器为每个宏块或编码单元选择量化参数。更高的 QP 意味着更激进的量化(压缩更多,画质更低),更低的 QP 意味着更温和的量化(压缩更少,画质更高)。
画质均衡:CRF 调整 QP 值以维持一致的感知画��。静态场景获得更高的 QP(用较少比特就能保持好效果),复杂场景获得更低的 QP(需要更多比特来保留细节)。
视觉心理学优化:使用 CRF 的现代编码器还会考虑人类视觉感知特性。人眼不太敏感的区域(快速运动、细微噪点)使用较低精度,而更重要的区域(边缘、人脸、文字)使用更高精度。
CRF 与量化参数(QP)的区别
CRF 常被与 QP 混淆,但两者有本质区别:
| 特性 | CRF | 恒定 QP |
|---|---|---|
| 控制目标 | 感知画质 | 数学量化 |
| 码率表现 | 按需变化以维持画质 | 随内容变化 |
| 画质一致性 | 一致的感知画质 | 不一致的感知画质 |
| 视觉心理学优化 | 有(多数编码器) | 无 |
| 场景自适应 | 按场景调整 QP | 全局固定 QP |
恒定 QP 下,简单场景和复杂场景接受相同的量化水平,这意味着简单场景画质高于必要水平,而复杂场景画质低于应有水平。CRF 纠正了这种不平衡。
CRF 公式
在 x264 和 x265 中,CRF 大致遵循以下关系:
QP = CRF + 复杂度偏移
其中"复杂度偏移"由编码器对每帧复杂度相对于视频平均值的分析决定。简单帧得到正偏移(更高 QP,更少比特),复杂帧得到负偏移(更低 QP,更多比特)。
实际实现远比这复杂,涉及前瞻缓冲、宏块树分析(mbtree)和帧类型加权等机制,但这个简化模型捕捉了核心概念。
宏块树分析(mbtree)
x264 和 x265 中 CRF 最重要的子功能之一是宏块树分析。启用时(默认开启),mbtree 追踪每个宏块被未来帧引用的频率。
频繁被引用的宏块(如静态背景区域)获得更多比特,因为其画质损失会传播到许多未来帧。很少被引用的宏块(如即将被运动遮挡的区域)获得更少比特,因为其影响是暂时的。
这就是 CRF 显著优于恒定 QP 编码的原因,即使平均 QP 可能相近。
各编码器的 CRF 标尺
每个视频编码器有自己的 CRF 标尺。这些标尺不可直接对比,因为它们反映了不同的底层量化体系。
H.264 (x264) CRF 标尺
- 范围:0-51
- 默认值:23
- 无损:0
- 视觉无损:约 17-18
- 每 +6 CRF:量化程度大致翻倍
H.265 (x265) CRF 标尺
- 范围:0-51
- 默认值:28
- 无损:0
- 视觉无损:约 20-22
H.265 与 H.264 使用相同的数值范围,但默认值是 28 而非 23。这并不意味着 H.265 CRF 28 的画质更低,而是 H.265 CRF 28 产出与 H.264 CRF 23 大致相当的画质,但文件更小。更多对比详见 H.264 与 H.265 对比。
VP9 CRF 标尺
- 范围:0-63
- 默认值:31
- 无损:0
- 视觉无损:约 15-20
VP9 使用更宽的标尺(0-63),因此数值不可与 H.264/H.265 直接对比。
AV1 CRF 标尺
- 范围:0-63(libaom 和 SVT-AV1 均是)
- 默认值:32(libaom)、35(SVT-AV1)
- 无损:0
- 视觉无损:约 18-23(libaom)、20-25(SVT-AV1)
各编码器的全面对比请参阅 AV1 vs VP9 vs H.264 分析。
跨编码器画质等效表
| 画质级别 | H.264 CRF | H.265 CRF | VP9 CRF | AV1 (SVT) CRF |
|---|---|---|---|---|
| 视觉无损 | 17-18 | 20-22 | 15-20 | 20-25 |
| 优秀 | 19-21 | 23-25 | 22-28 | 26-30 |
| 良好(通用) | 22-24 | 26-28 | 30-34 | 32-36 |
| 可接受 | 26-28 | 30-32 | 36-40 | 38-42 |
| 低画质 | 30+ | 34+ | 42+ | 45+ |
CRF 与其他码率控制方法对比
CRF vs 恒定码率(CBR)
CBR 无论内容复杂度如何都维持固定码率。这是最简单的码率控制方法,也是大多数直播场景的必要选择。
| 方面 | CRF | CBR |
|---|---|---|
| 画质一致性 | 画质一致 | 画质波动 |
| 码率表现 | 可变 | 固定 |
| 文件大小可预测性 | 不可预测 | 可预测 |
| 编码遍数 | 单遍 | 单遍 |
| 最适合 | 离线编码、归档 | 直播、实时传输 |
| 带宽占用 | 有波动 | 平稳 |
| 效率 | 高(比特按需分配) | 低(简单场景浪费比特) |
场景示例:一段 10 分钟的视频,前 5 分钟是静态演讲,后 5 分钟是激烈动作。
- CBR 5 Mbps:静态部分画质极好(比特过多),动作部分画质平平(比特不足)。总大小:375 MB。
- CRF 23:静态部分可能只用 2 Mbps(仍然画质极好),动作部分可能用 8 Mbps(同样画质极好)。总大小:约 300 MB,且整体画质更好。
CRF vs 可变码率(VBR)
两遍 VBR 和 CRF 一样能根据场景复杂度调整码率,但它以特定的平均码率(从而可预测的文件大小)为目标,而非画质水平。
| 方面 | CRF | 两遍 VBR |
|---|---|---|
| 画质一致性 | 高 | 高 |
| 文件大小可预测性 | 低 | 高 |
| 编码遍数 | 1 | 2 |
| 编码速度 | 较快 | 较慢(约 2 倍) |
| 码率目标 | 无(画质目标) | 指定平均码率 |
| 最适合 | 画质优先的编码 | 文件大小受限的编码 |
选择 VBR 而非 CRF 的场景:需要精确控制文件大小(邮件附件限制、存储配额)或特定平均码率(CDN 带宽规划)时。
CRF vs 恒定 QP(CQP)
恒定 QP 对每帧应用相同的量化参数,不做任何画质自适应逻辑。
| 方面 | CRF | 恒定 QP |
|---|---|---|
| 画质分配 | 跨场景优化 | 全局统一 QP |
| 感知画质 | 一致 | 随场景复杂度变化 |
| 压缩效率 | 更高 | 更低 |
| 使用场景 | 通用编码 | 测试、基准评测 |
| mbtree 支持 | 有 | 无 |
实际上,几乎没有理由在生产环境中使用恒定 QP 而非 CRF。CQP 主要用于学术研究和编码器基准评测,这些场景需要一致的量化(而非一致的画质)。
决策流程图
是否用于直播或实时传输?
是 -> 使用平台推荐码率的 CBR
否 -> 是否需要特定文件大小?
是 -> 使用两遍 VBR 搭配目标码率
否 -> 是否需要码率上限?
是 -> 使用受限 CRF(CRF + maxrate + bufsize)
否 -> 使用 CRF
预设对 CRF 输出的影响
一个常见的误解是 CRF 单独决定输出文件大小。实际上,编码预设有着显著影响。
预设控制编码器在寻找最优压缩时投入多少计算量。更慢的预设能找到更好的压缩方式,在相同 CRF 值下产出更小的文件。
预设对文件大小的影响(H.264,CRF 23,1080p,60 秒)
| 预设 | 编码速度 | 大致文件大小 | 相对 medium |
|---|---|---|---|
| ultrafast | 10x | 65 MB | +85% |
| superfast | 7x | 55 MB | +57% |
| veryfast | 5x | 48 MB | +37% |
| faster | 3.5x | 42 MB | +20% |
| fast | 2.5x | 38 MB | +8% |
| medium | 1x(基准) | 35 MB | -- |
| slow | 0.5x | 32 MB | -8% |
| slower | 0.3x | 30 MB | -14% |
| veryslow | 0.15x | 28 MB | -20% |
| placebo | 0.05x | 27.5 MB | -21% |
关键发现:
- 从
ultrafast到medium的文件大小降幅巨大(近 2 倍) - 从
medium到veryslow的降幅较为温和(约 20%) placebo相比veryslow几乎没有改善,但速度代价极大- 对于大多数工作流,
medium或slow是最佳选择
受限 CRF:兼顾画质与码率控制
受限 CRF 是一种混合方案,以 CRF 作为主要画质目标,同时设置最大码率上限。适用于需要画质自适应编码但不能超过特定带宽的流媒体场景。
ffmpeg -i input.mp4 -c:v libx264 -crf 22 -maxrate 6M -bufsize 12M output.mp4
受限 CRF 的行为模式:
- 大部分时间,编码器按纯 CRF 模式运行
- 当 CRF 目标会导致码率超过
-maxrate时,编码器提高 QP 以控制在限制内 - 原本会突破 6 Mbps 的场景被更激进地压缩
- 自然低于 6 Mbps 的简单场景以完整 CRF 画质编码
-bufsize决定编码器对码率超标的反应速度(通常设为 maxrate 的 2 倍)
不同内容类型的 CRF 策略
高速运动内容(体育、游戏、动作片)
高速运动内容每帧需要更多比特才能保持画质。同一 CRF 值下,体育视频的文件远大于静态讲话视频。
- H.264 建议 CRF 18-22
- 实拍体育可配合
-tune film - 考虑使用更高帧率(60 fps)以减少单帧运动模糊
低运动内容(演示、教程、摄像头)
静态内容在 CRF 下压缩效率极高。编码器对未变化的区域分配极少比特。
- H.264 CRF 24-28 通常效果出色
- 同一 CRF 下,文件大小远小于高速运动内容
- 屏幕录制含文字时可配合
-tune stillimage
动画和卡通
动画内容有独特的特征:大面积均匀色块、锐利边缘,有时场景切换极快。
- H.264 可配合
-tune animation - H.264 CRF 20-24 效果良好
- 动画在同一 CRF 下通常比实拍内容压缩效果更好
带胶片颗粒的内容
保留胶片颗粒需要额外比特。处理不当时,CRF 编码要么浪费比特试图保留随机噪点,要么彻底抹平颗粒质感。
- H.264 配合
-tune grain可保留��粒 - 保留颗粒时建议 CRF 18-22
- 或者先降噪再编码,使用更高的 CRF
CRF 画质评估:VMAF、SSIM 和 PSNR
要客观对比不同 CRF 值的效果,可以使用画质指标:
VMAF(视频多方法评估融合):由 Netflix 开发,与人类感知高度相关。评分范围 0-100,95 分以上为优秀,70 分以上通常可接受。
SSIM(结构相似性指数):衡量帧间的结构相似度。评分范围 0-1,0.95 以上为优秀。
PSNR(峰值信噪比):最古老的指标,以 dB 为单位。数值越高越好,但与人类感知的相关性不如 VMAF。
## 计算原始视频与编码视频之间的 VMAF
ffmpeg -i encoded.mp4 -i original.mp4 -lavfi libvmaf -f null -
各 CRF 值典型 VMAF 分数(H.264,1080p���
| CRF | 典型 VMAF | 感知效果 |
|---|---|---|
| 17 | 97-99 | 视觉无损 |
| 20 | 95-97 | 优秀 |
| 23 | 92-95 | 很好 |
| 26 | 87-92 | 良好 |
| 30 | 80-87 | 可接受 |
| 35 | 70-80 | 可察觉的劣化 |
CRF 编码的常见陷阱
跨编码器混用 CRF 标尺
最常见的错误是假设不同编码器的 CRF 值等效。H.264 CRF 23 是"良好画质",但 H.265 CRF 23 是"优秀画质"(产出的文件比需要的更大)。请始终使用各编码器的推荐默认值。
忽略预设的影响
使用"CRF 23"的两个编码实例可能产出大小迥异的文件,如果一个用 -preset ultrafast,另一个用 -preset slow。请始终在 CRF 值旁标注预设参数。
禁用前瞻或 mbtree
部分编码流程为追求速度而禁用 mbtree 或使用零前瞻。这会显著削弱 CRF 智能分配比特的能力,使其相对恒定 QP 的优势大打折扣。
在带宽敏感场景使用纯 CRF
CRF 的可变码率可能产生瞬时峰值,耗尽网络缓冲。用于流媒体时,务必使用受限 CRF 搭配 -maxrate 和 -bufsize,或切换到 CBR。
用 Vibbit 简化 CRF 编码
理解 CRF 值、预设和编码器专属标尺需要技术知识,大多数内容创作者不应为此烦恼。Vibbit 视频压缩工具能根据你的内容类型和画质目标自动选择最优 CRF 值和编码设置。上传视频,选择画质等级,即可获得完美压缩的输出。如需格式转换并获取最优编码,试试我们的视频转换工具。
常见问题
CRF 在视频压缩中代表什么?
CRF 是 Constant Rate Factor(恒定质量因子)的缩写。它是一种码率控制方法,通过逐帧动态调整码率来维持整个视频中一致的感知画质水平。你指定的不是码率,而是画质目标(CRF 值),编码器会自动决定每帧的合适码率。
CRF 比固定码率编码更好吗?
CRF 产出的每字节画质优于恒定码率(CBR)编码,因为它将比特分配到最需要的地方。但 CRF 并非万能。直播需要可预测的码率(CBR 或受限 VBR),文件大小受限的分发需要两遍 VBR。对于以画质为优先的离线编码,CRF 几乎总是最佳选择。
为什么同一 CRF 值编码不同视频的文件大小差异很大?
这是设计使然。CRF 的目标是画质而非文件大小。运动丰富、细节复杂的视频需要更多比特来维持画质,因此文件更大。基本静态的视频需要更少比特,文件更小。如需可预测的文件大小,请改用两遍 VBR。
H.264 和 H.265 的 CRF 值能直接对比吗?
不能直接对比。虽然两者的 CRF 数值范围相同(0-51),但代表不同的画质水平。粗略换算为:H.265 CRF 约等于 H.264 CRF + 5。因此 H.264 CRF 23 大致对应 H.265 CRF 28,但 H.265 的文件会显著更小,因为 H.265 是更高效的编码器。
上传 YouTube 应该用什么 CRF?
上传 YouTube 建议使用 CRF 17-20 搭配 H.264 和 slow 预设。YouTube 无论如何都会重新编码,上传更高画质的源素材能让 YouTube 获得更好的原始材料。用 CRF 0(无损)上传没有意义,因为文件巨大而 YouTube 会大幅压缩。
CRF 能配合硬件编码器(NVENC、QuickSync)使用吗?
NVIDIA NVENC 和 Intel QuickSync 等硬件编码器有自己的类 CRF 模式(通常称为"恒定质量"或 CQP 模式),但与软件 CRF 并不完全相同。硬件编码器缺少 mbtree 分析和精密的前瞻功能,因此在同等画质下通常产出更大的文件。追求最佳 CRF 效果,请使用软件编码器(libx264、libx265、libsvtav1)。
如何找到最适合我内容的 CRF 值?
截取一段 30-60 秒的代表性片段,以多个 CRF 值编码(例如 H.264 用 20、23、26、28),对比画质和 VMAF 分数,检查文件大小。选择仍能满足画质要求的最高 CRF 值(最小文件)。这个测试只需几分钟,却能节省大量存储和带宽。