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



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

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

这让我android.media.MediaCodec$CodecException: Error 0xfffffff3

.当我在尝试-捕获-最终循环中捕获它时,它显然是一个android.media.MediaCodec.error_neg_13(代码:-13)。然而,视频看起来仍然很好,更换了音轨。

据我搜索,没有关于此错误的任何内容,甚至在日志中也没有。有谁知道是什么原因造成的,我如何防止它发生?

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

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

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

我设法避免了错误,只有在检查解码器输出缓冲区信息中的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更改。基本上,在获取解码器的输出缓冲区和将数据发送到编码器的输入缓冲区之间 - 而不是在将提取的数据/样本发送到解码器的输入缓冲区之前。

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

最新更新