MediaMuxer错误“无法停止复用器”

时间:2013-10-21 22:21:24

标签: android mp4 mediacodec muxer

我使用Camera使用mime-type“video / avc”编码MediaCodec预览数据,并将编码数据(仅限视频,无音频)传递给MediaMuxer。多路复用器似乎运行正常并创建一个合理大小的输出文件(即,我记录的时间越长,越大)。但是,当我尝试停止复用器时,我得到“无法停止复用器”错误:

10-21 10:39:40.755: E/AndroidRuntime(2166): Caused by: java.lang.IllegalStateException: Failed to stop the muxer

在失败的停止之前有一些可疑的MPEG4Writer日志消息:

10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track
10-21 10:39:40.740: E/MPEG4Writer(2166): Missing codec specific data
10-21 10:39:40.740: W/MPEG4Writer(2166): 0-duration samples found: 122
10-21 10:39:40.740: I/MPEG4Writer(2166): Received total/0-length (123/1) buffers and encoded 123 frames. - video
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping Video track source
10-21 10:39:40.740: D/MPEG4Writer(2166): Video track stopped
10-21 10:39:40.740: D/MPEG4Writer(2166): Stopping writer thread
10-21 10:39:40.740: D/MPEG4Writer(2166): 0 chunks are written in the last batch
10-21 10:39:40.740: D/MPEG4Writer(2166): Writer thread stopped
10-21 10:39:40.740: E/MPEG4Writer(2166): writer error ended!

有什么线索导致这个?不确定你还需要什么信息。

3 个答案:

答案 0 :(得分:15)

E/MPEG4Writer(2166): Missing codec specific data

听起来您没有使用包含CSD的MediaMuxer#addTrack()来致电MediaFormat。有关如何执行此操作的示例,请参阅EncodeAndMuxTest.java代码。

查看MediaMuxer使用的MPEG4Writer implementation,第2360行检查isTrackMalformed();如果CSD数据不存在,则设置ERROR_MALFORMED,但不立即返回。什么都没有清除错误,所以它会做一堆工作然后失败,这似乎与你所看到的相符。

答案 1 :(得分:6)

我有同样的问题。在关闭Muxer时,它会抛出“Failed to stop”错误。当我在ISO查看器中检查我保存的文件时,我找不到它中的Track。    我只是在从视频编码器获得第一个输出后创建了轨道才解决了问题。这就是我添加轨道的方法

 m_VideoTrackIndex = muxer.addTrack(mediaCodec.getOutputFormat());

轨道的媒体格式来自          mediaCodec.getOutputFormat()  只有在编码第一帧后才会初始化。我在获得第一个编码数据后改变了我的代码以添加轨道(当然只有一次)。它工作正常。

答案 2 :(得分:3)

Android 5.0.2设备Moto E有2个问题 1)宽度和宽度如果不提供高度16的高度崩溃 2)在第一帧编码后设置mediaBuffer