在视频处理工作流中,码率往往是决定文件体积、画质和传输成本的关键因素。FFmpeg 提供了非常灵活的码率控制能力,既可以指定平均码率,也可以限制最大码率,甚至可以实现接近恒定码率的输出。
不过,实际压缩时如果只写 -b:v 2000k,并不一定能得到最理想的体积和画质,还需要结合编码器、音频码率、分辨率、预设值以及码率缓冲参数一起调整。
码率的本质是“每秒视频占用的数据量”。粗略计算时,可以用下面这个公式:
码率 ≈ 文件大小 × 8 ÷ 视频时长
例如一个 100MB、时长 60 秒的视频,总码率约为:100 × 8 ÷ 60 ≈ 13.3 Mbps
如果音频码率固定为 128kbps,那么视频码率大约需要减去音频部分。实际工程中常用 128kbps 作为 AAC 音频码率,既能兼顾音质,也便于计算。
需要注意的是,FFmpeg 中的码率控制并不是“绝对精确的文件大小控制器”。即使指定了目标码率,最终体积仍可能有一定偏差。如果对文件大小要求非常严格,建议配合双遍编码或更严格的码率上限参数使用。
如果只是想把视频码率降低,可以使用 -b:v 直接指定视频码率:
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -c:a aac -b:a 128k output.mp4
其中:
-i input.mp4:输入文件
-c:v libx264:使用 H.264 编码器,兼容性较好
-b:v 2000k:视频目标码率 2000kbps
-c:a aac -b:a 128k:音频使用 AAC,码率 128kbps
output.mp4:输出文件
这条命令适合快速压缩高码率视频,例如把相机拍摄的原始视频压成适合上传、备份或二次分发的版本。
只写 -b:v 时,FFmpeg 通常会按平均码率进行控制。也就是说,复杂画面可能暂时使用更高码率,简单画面则使用更低码率。
如果希望码率波动不要太大,可以加上 -maxrate 和 -bufsize:
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -maxrate 2500k -bufsize 4000k -c:a aac -b:a 128k output.mp4
-b:v 2000k:目标平均码率
-maxrate 2500k:限制最高瞬时码率
-bufsize 4000k:码率控制缓冲区,影响码率波动范围
-bufsize 可以理解为编码器用来平衡码率波动的“缓冲池”。缓冲区过小,可能导致画质不稳定;缓冲区过大,则可能降低对码率峰值的限制效果。
如果希望输出文件更接近目标体积,推荐使用双遍编码。第一遍分析视频内容,第二遍根据分析结果分配码率。
Windows 下示例:
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 1 -an -f mp4 NUL
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 2 -c:a aac -b:a 128k output.mp4
Linux/macOS 下可将 NUL 替换为 /dev/null。
双遍编码通常比单遍编码更慢,但在目标码率明确、文件体积要求严格时效果更好。比如需要把视频控制在某个平台上传限制内,或者批量导出统一体积的素材时,双遍编码更可靠。
FFmpeg 中常见的两种思路是:
指定码率:使用 -b:v,适合有明确体积或带宽限制的场景。
指定质量:使用 -crf,适合更关注画质、对体积没有严格限制的场景。
CRF 示例:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
CRF 取值范围是 0–51,默认 23,数值越小画质越高、文件越大,数值越大压缩越强、画质越低。通常 18–23 可以获得较好的视觉质量,23–28 适合网络传输。
如果既想保持质量,又不希望码率过高,可以组合使用 CRF 和最大码率:
ffmpeg -i input.mp4 -c:v libx264 -crf 22 -maxrate 2500k -bufsize 4000k -c:a aac -b:a 128k output.mp4
这种写法会以 CRF 22 为目标质量,但当码率超过上限时会自动降低局部画质,避免体积失控。
H.265 在相同画质下通常比 H.264 更节省体积,但编码速度更慢,兼容性也略差一些。
H.265 示例:
ffmpeg -i input.mp4 -c:v libx265 -b:v 1500k -preset medium -c:a aac -b:a 128k output.mp4
如果使用 GPU 加速,例如 NVIDIA NVENC,可以改为:
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -b:v 2000k -preset p6 -c:a aac -b:a 128k output.mp4
硬件编码速度更快,但同码率下画质通常不如软件编码精细,适合对吞吐量要求较高的场景。
FFmpeg 指定码率压缩视频的核心,是在“文件大小、画质、编码速度、兼容性”之间找到平衡。日常压缩可以直接用 -b:v 或 -crf;需要严格控制体积时加入双遍编码;面向直播或带宽受限场景时,再配合 -maxrate、-bufsize 和 CBR 参数。掌握这些组合,基本就能覆盖大多数视频压缩需求。