FFmpeg 编码 H264 视频码率过高问题解决方法

转码 mp4 的时候发现,输出的 H264 视频流码率高达 10M kbps+,而源码率只有约 2M kbps,这明显是不对的。明明已经通过 AVCodecContext::bit_rate 字段设定了码率却没有生效。

通过这篇 wiki,找到了答案。H264 有一套很复杂的码控规范,不能简单通过一个固定的码率数值指定输出码率——H264 基本上做不到这么精确的码控。推荐做法是启用 CRF 码控,设置合适的压缩率:

1
2
3
4
5
6
// 启用 CRF 码控
// CRF 参数值取值范围为 [0,51]。0 为无损,51 最差;23 是 libx264 默认值。
if (codec->id == AV_CODEC_ID_H264)
{
av_opt_set_int(_context, "crf", 23, AV_OPT_SEARCH_CHILDREN);
}

avcodec_open2() 之前加入上边代码块,输出视频流码率下降明显。

评论