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

时间:2018-02-22 04:31:17

标签: android mediacodec

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

this.audioDecoder.queueInputBuffer(decoderInputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);

这使我获得android.media.MediaCodec$CodecException: Error 0xfffffff3

当我在try-catch-finally循环中捕获它时,它显然是android.media.MediaCodec.error_neg_13(代码:-13)。然而,视频仍然看似很好,取而代之的是音轨。

就我搜索而言,这个错误没有任何意义,即使在日志中也没有。有谁知道是什么导致它以及如何防止它发生?

2 个答案:

答案 0 :(得分:2)

如果在包含要处理的数据而不是空缓冲区的缓冲区中发送android.media.MediaCodec.error_neg_13,则会得到MediaCodec.BUFFER_FLAG_END_OF_STREAM

我的解决方案是将MediaCodec.BUFFER_FLAG_END_OF_STREAM发送到不包含任何数据的单独缓冲区中。

在我对此错误的研究中,我没有找到任何对android.media.MediaCodec.error_neg_13的引用,甚至在libstagefright源代码中都没有,所以我不确定这是否是唯一原因。

答案 1 :(得分:1)

我设法通过在检查解码器输出缓冲区信息中的presentationTimeUs之后将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); }

该代码在处理音频缓冲区后执行,presentationTimesize从原始audioDecoderOutputBufferInfo更改。基本上,在获得解码器的输出缓冲器并将数据发送到编码器的输入缓冲器之间 - 而不是在将提取的数据/样本发送到解码器的输入缓冲器之前。

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