在android ffmpeg库上设置maxrate的正确方法是什么?

时间:2014-01-02 21:23:08

标签: android ffmpeg libavcodec bitrate

我正在尝试使用android上的ffmpeg库控制最大比特率输出。

当我使用ffmpeg命令行时,输出比特率为 166.78 kbit / s

ffmpeg -y -i input.mp4 -c:v libx264 -preset medium -crf 29 -profile:v baseline -level: 3.0 -s 640x480 -strict experimental -c:a aac -ac 1 -ar 22050 -ab 48k -movflags faststart -maxrate 200k -bufsize 2000k output.mp4

但是当我尝试使用android ffmpeg库时,输出比特率 2.12Mbit / s

这些是我传递avcodec_open2的选项。

av_dict_set(&opts, "preset", "medium", 0);
av_dict_set(&opts, "crf", "29", 0);
av_dict_set(&opts, "profile", "baseline", 0);
av_dict_set(&opts, "level", "30", 0);
av_dict_set(&opts, "maxrate", "200k", 0);
av_dict_set(&opts, "minrate", "0", 0);
av_dict_set(&opts, "bufsize", "2000k", 0);

/* open the codec */
ret = avcodec_open2(ctx, codec, &opts);

这些是上下文编解码器中的设置:

ctx->bit_rate = 200000;
ctx->width    = 640;
ctx->height   = 480;

我还有其他设置吗?

我会感激任何帮助。

谢谢!

编辑1:

我删除了maxrate和bufsize中的k,但输出比特率仍然不同。

例如:

ffmpeg -i input.mp4 -preset slow -c:v libx264 -maxrate 100k -bufsize 2000k -profile:v baseline -level 30 -s 480x360 -strict -2 -an output.mp4

产生比特率为 147.24 kbit / s

的输出

从android ffmpeg库运行时,它会产生不同比特率( 99.45 kbit / s )的输出,同时视频质量也会降低。

使用200000和350000作为maxrate和buffsize产生了157.49 kbit / s的视频,但与命令行结果相比,质量很差。

av_dict_set(&opts, "maxrate", "200000", 0);
av_dict_set(&opts, "bufsize", "350000", 0);

我也尝试过设置vbv-maxrate和vbv-bufsize而没有运气。

使用该库时,我缺少什么才能获得相同的比特率和质量?

谢谢!

2 个答案:

答案 0 :(得分:1)

ffmpeg lib不喜欢数字中的“k”。

将值更改为:

av_dict_set(&opts, "maxrate", "200000", 0);
av_dict_set(&opts, "minrate", "0", 0);
av_dict_set(&opts, "bufsize", "2000000", 0);

答案 1 :(得分:0)

crf选项使生成的文件具有恒定的质量,这与保持比特率约束是互斥的,因此删除crf选项并重试。