如何设置由MediaCodec创建的编码器缓冲区大小

7
我正在使用Nexus测试Mediacodec APIs编码。通过记录inputBuffers的容量,我可以看到编码器提供的inputBuffers为119040,但帧(即输入)的大小为460800。当我调用inputBuffer.put时,出现了buffer overflow错误消息。因此,我想将输入缓冲区设置为460800。我找到的API是BufferInfo.set。然而,我找不到一种方法将此设置附加到编码器上。能否有人提供帮助?谢谢!
encoder = MediaCodec.createByCodecName(codecInfo.getName());
ByteBuffer[] inputBuffers = encoder.getInputBuffers();
if (inputBufferIndex >= 0) {
    ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
    inputBuffer.clear();
    inputBuffer.put(input);
encoder.queueInputBuffer(inputBufferIndex, 0, input.length, 0, 0);}

你好,你找到解决方案了吗?如果是,请发一些提示或完整的解决方案。 - Shivam Pokhriyal
2个回答

7
我来晚了,但根据Android MediaCodec文档,我认为更改缓冲区的正确方法是调整MAX_INPUT_SIZE,例如:
int width=800;
int height=480;
encoder = MediaCodec.createByCodecName(codecInfo.getName());
format = MediaFormat.createVideoFormat ("video/avc", width, height);
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE,655360); // 0.5MB but adjust it as you need.

2
你不需要设置输入缓冲区的大小,它由MediaFormat确定,具体取决于宽度、高度和颜色格式。如果你的输入数据有不同的大小,那么你需要将它转换为编解码器所期望的格式。
这并不是非常容易,但是可以做到。您可以参考CTSEncodeDecodeTest中的缓冲区测试示例。该测试查询编解码器支持的颜色格式,生成相应格式的帧,将其提交给编码器,然后解码视频并确认输出与输入相同。
该测试通常需要API 18(Android 4.3),但缓冲区代码将在API 16中工作。它能否在任何给定设备上工作是另一个问题——因为CTS测试直到API 18才存在,所以在4.3之前的设备上可能无法正确运行。

不知道为什么,但当我在Android 7中尝试使用YV12图像格式作为输入和COLOR_FormatYUV420SemiPlanar作为输出时,它会给我相同大小的输入图像和输入缓冲区。但在Android 9中,YV12不受支持,我必须使用YUV_420_888作为输入图像格式,输入大小增加了。它不再是宽度高度3/2,而是变成了宽度高度2。而输出大小相同,这给我带来了缓冲区溢出问题。你能给我一些提示吗? - Shivam Pokhriyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接