Android MediaCodec-将EOS缓冲区发送到音频解码器时出现奇怪错误

Android MediaCodec-将EOS缓冲区发送到音频解码器时出现奇怪错误,android,android-mediacodec,Android,Android Mediacodec,我正在用另一个文件中的音乐替换视频的音轨。因此,我修改了标准的extractededitcodetestcode(来自bigflake),以便音频MediaExtractor是从所述的“另一个文件”创建的。当我尝试将EOS缓冲区发送到音频解码器时,发生了一件奇怪的事情,但是,在这一行: this.audioDecoder.queueInputBuffer(decoderInputBufferIndex,0,0,MediaCodec.BUFFER\u标志\u流的结束\u) 这给我带来了一个andr

我正在用另一个文件中的音乐替换视频的音轨。因此,我修改了标准的
extractededitcodetest
code(来自bigflake),以便音频
MediaExtractor
是从所述的“另一个文件”创建的。当我尝试将EOS缓冲区发送到音频解码器时,发生了一件奇怪的事情,但是,在这一行:

this.audioDecoder.queueInputBuffer(decoderInputBufferIndex,0,0,MediaCodec.BUFFER\u标志\u流的结束\u)

这给我带来了一个
android.media.MediaCodec$CodecException:Error 0xfffffff3

当我在try-catch-finally循环中捕捉到它时,它显然是一个
android.media.MediaCodec.error\u neg\u 13
(代码:-13)。然而,随着音轨的更换,视频看起来仍然很好


据我搜索,这个错误没有任何信息,甚至在日志中也没有。有人知道是什么原因造成的吗?我如何防止这种情况发生?

如果流的
MediaCodec.BUFFER\u标志\u END\u在包含要处理的数据的缓冲区中发送,而不是在空缓冲区中发送,则会出现
android.media.MediaCodec.error\u neg\u 13

我的解决方案是在不包含任何数据的单独缓冲区中发送流
MediaCodec.BUFFER\u FLAG\u END\u


在我研究这个错误的过程中,我没有发现任何关于android.media.MediaCodec.error_neg_13
,甚至在libstagefright源代码中也没有,所以我不确定这是否是唯一的原因。

我在检查解码器输出缓冲区信息中的
presentationTimeUs
后才将EOS标志发送到编码器,而不是在对解码器的输入缓冲区排队时发送EOS标志,从而避免了错误

守则:

if(presentationTime < totalTime) {                            
    audioEncoder.queueInputBuffer(encoderInputBufferIndex, 0, size, presentationTime, audioDecoderOutputBufferInfo.flags);
} else {
    audioEncoder.queueInputBuffer(encoderInputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); }
if(presentationTime
该代码在处理音频缓冲区后执行,
presentationTime
size
从原始的
audioDecoderOutputBufferInfo
更改。基本上,在获取解码器的输出缓冲区和将数据发送到编码器的输入缓冲区之间——而不是在将提取的数据/样本发送到解码器的输入缓冲区之前


注意:如果需要完整的代码部分,请告诉我。

显然,将EOS从解码器发送到编码器比从提取器发送到解码器更安全。所以我把EOS发送的东西移到了
audioEncoder.queueInputBuffer()
阶段。这是真的,但是如果你只需要输入文件的一部分,你就无法在需要时向EOS发送信号。顺便说一句,如果你找到了解决问题的方法,就贴一个答案来帮助其他有同样问题的人。这帮了大忙。我是从这里来的,我选择使用一个单独的缓冲区来调整现有代码的方式是添加一个无限等待,例如,
DECODER.dequeueInputBuffer(-1)您最终是如何解决此问题的?