15

我正在Camera使用 mime 类型“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!

任何线索是什么原因造成的?不确定您还需要什么信息。

4

3 回答 3

18
E/MPEG4Writer(2166): Missing codec specific data

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

查看使用的MPEG4Writer 实现MediaMuxer,第 2360 行有一个isTrackMalformed()检查;它设置ERROR_MALFORMEDCSD 数据是否不存在,但不会立即返回。没有什么能清除错误,所以它会做很多工作然后失败,这似乎与您所看到的相符。

于 2013-10-22T00:15:08.943 回答
9

我遇到了同样的问题。关闭 Muxer 时,它抛出“无法停止”错误。当我在 ISO 查看器中检查保存的文件时,我在其中找不到轨道。我仅在从视频编码器获得第一个输出后才通过创建轨道解决了问题。这是我添加轨道的方法

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

轨道的媒体格式是从 mediaCodec.getOutputFormat() 获得的,而后者仅在编码第一帧后才会被初始化。我更改了代码以在获取第一个编码数据后添加轨道(当然只有一次)。它是工作正常。

于 2015-04-24T23:21:42.063 回答
3

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

于 2016-02-08T13:32:29.593 回答