2013-03-04 392 views
5

我试图使用Nexus来测试Mediacodec API的编码。我可以看到编码器提供的inputBuffers是119040(通过记录inputBuffers.capacity)。但是帧的大小,即输入,是460800.我得到了inputBuffer.putbuffer overflow错误信息。所以我打算将输入缓冲区设置为460800.我可以找到的API是BufferInfo.set。但是,我无法找到将此设置附加到编码器的方法。有人可以帮忙吗?谢谢!!!如何设置由MediaCodec创建的编码器缓冲区大小

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);} 

回答

2

您不设置输入缓冲区的大小。尺寸由MediaFormat确定,具体为宽度,高度和颜色格式。如果您的输入数据具有不同的大小,则需要将其转换为编解码器预期的格式。

这并非完全无关紧要,而是可行的。有关示例,请参阅CTS EncodeDecodeTest中的缓冲区到缓冲区测试。测试查询编解码器以查看支持哪种颜色格式,生成该格式的帧,将它们提交给编码器,然后对视频进行解码并确认出来的内容与进入的内容相同。

该测试通常需要API 18(Android 4.3),但缓冲区到缓冲区的代码将在API 16中工作。它是否适用于任何给定的设备是另一个问题 - 因为CTS测试在API 18之前不存在,所以它是4.3之前的设备可能会犯这种错误。

3

,我迟到了,但基于: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. 
+0

这对我的作品! – 2017-06-17 10:16:35