更新比特率时,MediaCodec 输出比特率下降到 10%
MediaCodec output bitrate decrees to 10% when update bitrate
我想比较"bitrate-mode"和Android MediaCodec的区别,我的测试流程是:
- 使用 MediaExtractor 从 mp4 文件中提取 H.264 视频帧(来自视频的 100 秒剪辑),它的大小为 1280*720;
- 使用 MediaCodec 解码器解码那些视频帧;
- 将解码帧渲染到MediaCodec编码器的输入Surface中,输出大小为360*640;
- 收集编码器输出帧大小,计算每秒输出码率;
在测试过程中,我会改变编码器的输出比特率,看看它在不同的"bitrate-mode"、CQ、VBR和CBR中有什么变化。
我的问题是,在 VBR 和 CBR 模式下,一旦我更改了编码器输出比特率,例如从500kbps到600kbps或者400kbps,采集到的输出码率降到只有50kbps,再也起不来了!
我创建了一个 python 脚本来绘制结果,CBR 的结果如下:
红线是计算每一秒的输出码率,蓝点是码率更新动作,500 -> 1100 -> 400 -> 1000。我们可以看到我第一次更新码率,它减少到只有大约 50 kbps。
知道发生了什么事吗?
更多信息:
当我将编码器的输出大小更改为 1280*720 时,绘图如下所示:
这里是我的测试项目的源代码:https://github.com/Piasy/MediaCodecRcTest
请帮帮我,谢谢!
您的问题似乎是您的变量 mCurrentBr
以 kbps 为单位,而 API 期望它以单位 bps 为单位。您在初始化时正确处理了这个问题:
encodeFormat.setInteger(MediaFormat.KEY_BIT_RATE, mConfig.initBr() * 1000);
mCurrentBr = mConfig.initBr();
但是在更新比特率时没有这样做:
mParams.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, mCurrentBr);
如果您在第二个位置添加 * 1000
,我希望它的表现会好得多。
我想比较"bitrate-mode"和Android MediaCodec的区别,我的测试流程是:
- 使用 MediaExtractor 从 mp4 文件中提取 H.264 视频帧(来自视频的 100 秒剪辑),它的大小为 1280*720;
- 使用 MediaCodec 解码器解码那些视频帧;
- 将解码帧渲染到MediaCodec编码器的输入Surface中,输出大小为360*640;
- 收集编码器输出帧大小,计算每秒输出码率;
在测试过程中,我会改变编码器的输出比特率,看看它在不同的"bitrate-mode"、CQ、VBR和CBR中有什么变化。
我的问题是,在 VBR 和 CBR 模式下,一旦我更改了编码器输出比特率,例如从500kbps到600kbps或者400kbps,采集到的输出码率降到只有50kbps,再也起不来了!
我创建了一个 python 脚本来绘制结果,CBR 的结果如下:
红线是计算每一秒的输出码率,蓝点是码率更新动作,500 -> 1100 -> 400 -> 1000。我们可以看到我第一次更新码率,它减少到只有大约 50 kbps。
知道发生了什么事吗?
更多信息:
当我将编码器的输出大小更改为 1280*720 时,绘图如下所示:
这里是我的测试项目的源代码:https://github.com/Piasy/MediaCodecRcTest
请帮帮我,谢谢!
您的问题似乎是您的变量 mCurrentBr
以 kbps 为单位,而 API 期望它以单位 bps 为单位。您在初始化时正确处理了这个问题:
encodeFormat.setInteger(MediaFormat.KEY_BIT_RATE, mConfig.initBr() * 1000);
mCurrentBr = mConfig.initBr();
但是在更新比特率时没有这样做:
mParams.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, mCurrentBr);
如果您在第二个位置添加 * 1000
,我希望它的表现会好得多。