用FFmpeg修改视频码率
📦 码率控制与画质平衡
码率是影响视频质量和文件大小的核心参数,选择合适的码率控制策略至关重要:
- CRF模式:恒定质量因子编码,在文件大小和画质之间自动平衡。推荐值 23~28。适合本地存档和个人项目,画质优先,文件大小次之。
- ABR模式:平均码率控制,码率波动范围可控。适合流媒体平台上传(如B站、YouTube),这些平台有码率上限要求,需要确保文件大小在合理范围内。
- CBR模式:恒定码率,码率严格保持固定。适合直播推流,因为直播需要稳定的带宽消耗。缺点是简单画面浪费数据,复杂画面可能质量不足。
- 内容适配:静态内容(PPT录屏、讲课视频)所需码率较低;动态内容(动作片、游戏)需要更高的码率来保持画质。同一码率下,静态内容画质远好于动态内容。
FFmpeg码率控制详解
码率(Bitrate)是视频编码中最重要的参数之一,它决定了视频文件的大小和画质。FFmpeg提供了多种码率控制模式,以适应不同的应用场景:
- ABR(Average Bitrate,平均码率):使用
-b:v参数指定一个目标平均码率,编码器会尽力使输出码率接近该值。适用于流媒体等有带宽限制的场景,码率波动较小,文件大小可预测。 - CRF(Constant Rate Factor,恒定质量因子):使用
-crf参数,取值范围 0~51,值越小质量越高,文件也越大。通常推荐值在 23~28 之间(23 视觉无损,28 对大多数内容仍可接受)。CRF 模式不限定输出文件大小,而是专注于保持恒定的视觉质量,适合个人存档和本地播放。 - CBR(Constant Bitrate,恒定码率):通过同时指定
-b:v(目标码率)、-minrate(最小码率)、-maxrate(最大码率)和-bufsize(缓冲区大小)来实现,通常要求三者相等。码率严格恒定,适合直播等对码率波动有严格要求的场景。
核心规律:码率与画质成正比,与文件大小成正比。码率越高,每帧分配的数据量越多,画质越好,但文件体积也越大。选择合适的码率控制模式需要根据具体需求权衡:追求画质选 CRF,控制大小选 ABR,直播推流选 CBR。
广告
{{v.name}}
固定目标码率(Average Bitrate, ABR)。使用 -b:v 参数指定一个目标平均码率,代码如下
$ ffmpeg -i input.mp4 -b:v 2000k output.mp4
恒定质量(Constant Rate Factor, CRF)。使用 -crf 参数,其后跟随一个整数值。CRF值越小,质量越高,文件越大,代码如下
$ ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
恒定比特率(Constant Bitrate, CBR)。通过同时指定目标码率 (-b:v)、最小码率 (-minrate)、最大码率 (-maxrate) 并配合缓冲区大小 (-bufsize) 来实现,通常要求 -minrate、-maxrate 和 -b:v 三者相等,代码如下
$ ffmpeg -i input.mp4 -b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k output.m2v
二次编码(Two-Pass Encoding)。二次编码适用于对输出文件大小有精确要求的情况。
第一次编码:分析视频并生成日志文件,代码如下
$ ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 1 -an -f null /dev/null
第二次编码:根据第一次分析的结果进行实际编码,代码如下
$ ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 2 -c:a aac -b:a 128k output.mp4
可变比特率(Variable Bitrate, VBR)。设置缓冲区大小(-bufsize),编码器预设(-preset),配置文件(-profile:v),级别(-level:v),代码如下
$ ffmpeg -i input.mp4 -b:v 2000k -bufsize 4000k -preset veryslow -profile:v high -level:v 4.1 output.mp4