我有一个例子,我正在使用MediaCodec解码mp3音频,以便使用MediaPlayer和AudioTrack进行播放。该示例使用的是getInputBuffers(),现在已在API 21+中进行了描述。新的getInputBuffer(int index)返回一个缓冲区而不是数组,MediaCodec的API引用仍然显示getInputBuffers()的用例。
任何人都可以解释我如何使用新方法吗?我每次只得到索引0吗?我开始循环并获取每个并创建一个数组但是没有一个地方,我已经看到了,我可以获得可用缓冲区的长度。
答案 0 :(得分:7)
你不应该尝试获取所有缓冲区。
在API 21之前,您执行ByteBuffer inputs[] = codec.getInputBuffers()
。然后index = codec.dequeueInputBuffer()
将返回缓冲区索引,并且您使用inputs[index]
,最后使用codec.queueInputBuffer(index, ...)
提交缓冲区。
请注意,您一次只能触摸inputs[]
中的多个元素,而且您只能在dequeueInputBuffer
和queueInputBuffer
来电之间进行触摸。
现在,您不再拥有ByteBuffer
个对象数组,而只允许您同时触摸一个对象,而现在应该只获取您要访问的单个ByteBuffer
填。也就是说,在index = codec.dequeueInputBuffer()
之后,请拨打inputs[index]
,而不是codec.getInputBuffer(index)
。
基本上,您以前从getInputBuffers()
返回的数组仍然存在于MediaCodec
对象内部,但您不需要保持整个数组可用,只需获取每次都要触摸的单个缓冲区。