FFmpeg 视频压缩实战:CRF/CBR/VBR 三种模式怎么选

码率控制:从基本概念讲起

要理解 CRF、CBR、VBR 三种模式的差异,先要从码率这个概念说起。

码率(Bitrate)是指视频数据在单位时间内的大小,通常以 kbps(千比特每秒)或 Mbps(兆比特每秒)来衡量。它直接决定了视频的清晰度、流畅度以及最终的文件体积。在分辨率、帧率、编码器相同的前提下,码率越高,画面保留的细节越丰富,文件也越大;码率越低,体积越小,但画面容易出现模糊、色块、马赛克等失真现象。

那么为什么需要码率控制?原因在于视频画面的复杂度是动态变化的。一段视频中,静止的背景、纯色画面只需很少的数据就能无损还原;而快速运动、丰富纹理、剧烈变化的场景则需要多得多的数据才能保持清晰。如果全程采用固定码率,简单场景会白白浪费存储空间,复杂场景又可能因为分配的比特不足而出现明显失真。

码率控制的核心目标,就是在有限的存储空间或传输带宽条件下,合理地为每一帧画面分配比特数,在画质与体积之间取得最优平衡。不同的码率控制模式,本质上就是不同的"比特分配策略"。CRF、CBR、VBR 三种模式,分别代表了三种不同的分配思路。

三种码率控制模式详解

CRF(Constant Rate Factor,恒定速率因子)

CRF 的核心思想是"画质恒定"。编码器会根据每一帧画面的复杂度动态分配码率:遇到简单场景时减少比特投入,遇到复杂场景时增加比特投入,从而在整段视频中保持主观画质的一致性。也就是说,无论画面是静止的风景还是激烈的动作戏,观众感受到的画面质量是大致相同的。

CRF 通过一个介于 0 到 51 之间的整数(x264/x265 编码器)来控制画质等级。数值越小,画质越高、文件体积越大;数值越大,画质越低、文件体积越小。其中 0 表示无损编码,51 表示质量最差,23 通常是默认的视觉无损参考值。

CRF 的最大优点是使用简单、画质稳定。它不需要预先设定目标码率,编码器会自动根据画面复杂度完成比特分配。正因为如此,CRF 成为离线压缩、文件存储、网页发布等大多数非实时场景的首选模式。

CBR(Constant Bitrate,恒定码率)

CBR 的特点是全程保持码率固定。无论画面复杂还是简单,编码器都输出大小相同的数据流。这意味着在简单场景下,分配的比特会有冗余甚至浪费;而在复杂场景下,比特又可能不够用,从而导致失真。

CBR 的优势在于码率完全可预测、对缓冲区友好。这种特性使它特别适合直播推流、实时视频传输等对带宽稳定性要求严格的场景。在这些场景中,网络带宽往往是固定的,如果码率波动过大,容易造成缓冲区溢出或网络拥塞,导致卡顿。CBR 用牺牲部分画质为代价,换取了传输的稳定性。

VBR(Variable Bitrate,可变码率)

VBR 允许码率在一个指定的范围内动态调整。编码器会根据画面复杂度和目标质量,在设定的最小码率与最大码率之间自行权衡。VBR 通常需要设置目标码率(或目标质量)以及码率上下限,它比 CBR 灵活,又比 CRF 多了一层码率约束。

VBR 常见于需要同时控制总体积和兼顾画质的场景,例如流媒体分片编码。值得注意的是,x264 编码器还提供一种 2-pass VBR 模式:第一遍扫描分析整个视频的复杂度分布,第二遍根据分析结果精确分配码率。这种模式能在精确控制目标体积的同时优化码率分配,但编码时间约为单遍编码的两倍,适合对体积有严格要求且不急于实时输出的离线任务。

三种模式的码率波动对比

下图直观展示了三种模式在同一视频中的码率波动情况。可以清楚看到,CBR 是一条水平直线,CRF 和 VBR 都会随画面复杂度起伏,但 CRF 的波动范围更大、更自由,而 VBR 则被限制在上下限之间。

流程图 1

CRF 值与画质、体积的关系

CRF 值的选择是使用 CRF 模式时最关键的一步。下图展示了 CRF 值从 18 到 30 变化时,画质与体积的相对变化趋势:CRF 值越小,画质越高但体积越大;CRF 值越大,体积越小但画质下降。

流程图 2

FFmpeg 命令示例:三种典型场景

下面给出三个常见的压缩场景,分别对应不同的画质与体积需求。

场景一:邮件发送(H.264 + 720p + CRF 28)

邮件附件通常有大小限制,需要把视频压到较小体积,720p 分辨率配合 CRF 28 能在保证可观看的前提下显著减小文件。


ffmpeg -i input.mp4 \
  -c:v libx264 -preset medium -crf 28 \
  -vf "scale=-2:720" \
  -c:a aac -b:a 128k \
  output.mp4

场景二:网页发布(H.264 + 1080p + CRF 26)

网页视频需要在清晰度与加载速度之间平衡,1080p 配合 CRF 26 是兼顾两者的常用组合,兼容性也最好。


ffmpeg -i input.mp4 \
  -c:v libx264 -preset medium -crf 26 \
  -vf "scale=-2:1080" \
  -c:a aac -b:a 128k \
  output.mp4

场景三:存储归档(H.265 + 原始分辨率 + CRF 20)

归档场景追求高画质与高压缩效率,使用 H.265 编码器、保留原始分辨率,CRF 20 能在接近视觉无损的同时获得比 H.264 更小的体积。


ffmpeg -i input.mp4 \
  -c:v libx265 -preset medium -crf 20 \
  -c:a aac -b:a 192k \
  output.mp4

命令中的几个关键参数含义如下:-c:v 指定视频编码器,libx264 对应 H.264、libx265 对应 H.265;-preset 控制编码速度与压缩效率的权衡,越慢压缩率越高;-crf 设定画质等级;-vf "scale=-2:720" 将高度缩放到 720 像素,宽度按比例自动计算并保证为偶数;-c:a aac -b:a 128k 设置音频编码为 AAC、码率 128 kbps。

CRF 值选择建议

下表给出了 CRF 值的常见选择区间,可作为快速参考。实际使用时建议先按场景取推荐区间的中间值试压一小段,再根据效果微调。

CRF 范围画质等级体积适用场景
18-22高质量较大存储归档、素材备份、高质量播放
23-26标准适中网页发布、在线点播、移动端播放
27-30极致压缩较小邮件发送、即时通讯、带宽受限场景

CRF vs CBR vs VBR 对比

下表从画质、体积、编码速度、适用场景四个维度对比三种模式,便于根据实际需求做出选择。

对比项CRFCBRVBR
画质稳定性高(全程一致)低(复杂场景易失真)中(受码率上下限约束)
文件体积不可预测可预测大致可预测(2-pass 更精确)
编码速度快(单遍)较慢(2-pass 约为两倍)
适用场景离线压缩、存储、网页发布直播推流、实时传输流媒体分发、体积受限任务

常见问题(FAQ)

1. CRF 值到底怎么选?

CRF 值没有放之四海皆准的标准,取决于你对画质与体积的权衡。一般建议从 CRF 23-26 开始试压,如果画质满意,可以逐步增大数值以进一步压缩体积;如果画质不足,则减小数值。对于大多数用途,CRF 23-26 是兼顾画质与体积的合理区间。归档类需求可用 18-22,对体积敏感的传输场景可用 27-30。

2. 视频压后变模糊怎么办?

模糊通常由码率不足或分辨率缩放过度引起,可以从几个方面排查:第一,降低 CRF 值,例如从 28 降到 24,给编码器更多比特;第二,检查是否过度缩小了分辨率,必要时提高输出分辨率;第三,选择更慢的 preset(如 slow、slower),用更长的编码时间换取更好的压缩质量;第四,确认是否误用了过强的降噪或去隔行滤镜,这些滤镜在参数不当时也会导致画面发软。

3. H.264 和 H.265 怎么选?

H.264 兼容性最广,几乎所有现代设备、操作系统和浏览器都支持,适合需要广泛分发的场景,例如网页视频、移动端播放。H.265(HEVC)压缩效率更高,在同等画质下体积比 H.264 小约 30%-50%,但编码速度较慢,且部分老旧设备和浏览器不支持。如果目标是存储归档或面向现代设备分发,优先选 H.265;如果追求最大兼容性,选 H.264。

总结

码率控制是视频压缩的核心环节,选对模式往往比纠结具体参数更重要。CRF 以画质恒定为优先,是离线压缩和文件存储的首选;CBR 以码率稳定为优先,适合直播和实时传输;VBR 在两者之间折中,适合对总体积有约束的分发场景。

在实际操作中,掌握三点就能应对绝大多数需求:一是根据场景选择合适的码率控制模式,二是合理选取 CRF 值并在试压后微调,三是根据兼容性需求在 H.264 与 H.265 之间取舍。配合 preset 对编码速度与压缩效率的调节,就能用 FFmpeg 在不同场景下输出兼顾画质与体积的视频。

相关阅读: