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

Posted

技术标签:

【中文标题】如何设置 MediaCodec 创建的编码器缓冲区大小【英文标题】:How to set encoder buffer size created by MediaCodec 【发布时间】:2013-02-18 14:03:34 【问题描述】:

我正在尝试使用 Nexus 来测试 Mediacodec API 的编码。我可以看到编码器提供的 inputBuffers 是 119040(通过记录 inputBuffers.capacity)。但是框架的大小,即输入,是 460800。我在inputBuffer.putbuffer 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);

【问题讨论】:

您好,您找到解决方案了吗?如果是,请发布一些提示或完整的解决方案。 【参考方案1】:

我迟到了,但基于:android MediaCodec Documentation 我认为更改缓冲区的正确方法是调整 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 决定,特别是宽度、高度和颜色格式。如果您的输入数据大小不同,您需要将其转换为编解码器所期望的格式。

这不是微不足道的,而是可行的。例如,请参阅 CTS EncodeDecodeTest 中的缓冲区到缓冲区测试。测试查询编解码器以查看支持的颜色格式,生成该格式的帧,将它们提交给编码器,然后对视频进行解码并确认输出的内容与输入的内容相同。

测试通常需要 API 18 (Android 4.3),但缓冲区到缓冲区的代码将在 API 16 中运行。它是否适用于任何给定的设备是一个不同的问题 - 因为 CTS 测试没有在 API 18 之前存在,4.3 之前的设备可能会出现此错误。

【讨论】:

不知道如何,但是当我在 Android 7 中尝试使用 YV12 图像格式作为输入,COLOR_FormatYUV420SemiPlanar 作为输出时,它给了我相同大小的输入图像和输入缓冲区。但是在不支持 YV12 的 Android 9 中,我不得不使用 YUV_420_888 作为输入图像格式,并且输入的大小增加了。它不再是宽度 * 高度 * 3/2,而是变成了宽度 * 高度 * 2。虽然输出大小相同,但这给了我缓冲区溢出问题。你能建议一些提示吗

以上是关于如何设置 MediaCodec 创建的编码器缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

如何将相机预览传递给 MediaCodec.createInputSurface() 创建的 Surface?

Android MediaCodec简单总结

简单高效易用Windows/Linux/ARM/Android/iOS平台实现RTMP推送组件EasyRTMP-Android MediaCodec硬编码流程介绍

如何使用 Android MediaCodec 编码相机数据(YUV420sp)

如何在 MediaCodec 编码器和 CameraX 之间共享 Surface

如何使用 MediaCodec 将位图编码为视频?