如何使用新的 MediaCodec getInputBuffer(int index)

How do I use the new MediaCodec getInputBuffer(int index)

我有一个正在使用 MediaCodec 解码 mp3 音频以使用 MediaPlayer 和 AudioTrack 播放的示例。该示例使用的是 getInputBuffers(),现在已在 API 21+ 中描述。新的 getInputBuffer(int index) returns 一个缓冲区而不是一个数组,MediaCodec 的 API 参考仍然显示了 getInputBuffers() 的用例。

谁能解释一下我需要如何使用新方法?我每次都只得到索引 0 吗?我开始循环并获取每个并制作一个数组,但我没有看到一个地方可以获取可用缓冲区的长度。

您不应该尝试获取所有缓冲区。

在 API 21 之前,您会做 ByteBuffer inputs[] = codec.getInputBuffers()。然后 index = codec.dequeueInputBuffer() 将 return 一个缓冲区索引,然后您将使用 inputs[index],最后使用 codec.queueInputBuffer(index, ...).

提交缓冲区

请注意,您一次只能触摸 inputs[] 中的一个元素,并且您只能在 dequeueInputBufferqueueInputBuffer 调用之间触摸该元素。

现在,您一次只使用一个 ByteBuffer 对象数组,现在应该只获取要填充的单个 ByteBuffer 对象。也就是说,在 index = codec.dequeueInputBuffer() 之后,而不是使用 inputs[index],调用 codec.getInputBuffer(index).

所以基本上,您用来从 getInputBuffers() 获取 return 的数组仍然存在于 MediaCodec 对象内部,但您不需要保留完整数组可用,每次只获取您要使用的单个缓冲区。