繁体   English   中英

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

[英]MediaCodec - strange error when sending EOS buffer into audio decoder

我正在努力用另一个文件中的音乐替换我的视频的音轨。 因此,我修改了标准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)。 然而,视频仍然看起来不错,替换了音轨。

据我搜索,这个错误没有任何内容,甚至在日志中也没有。 有谁知道是什么导致了它以及我如何防止它发生?

如果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改变。 基本上,在获取解码器的输出缓冲区和将数据发送到编码器的输入缓冲区之间 - 而不是在将提取的数据/样本发送到解码器的输入缓冲区之前。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM