MediaMuxer.start()后直接调用stop()抛出IllegalStateException的原因
Android MediaMuxer调用stop()抛出IllegalStateException的原因
测试代码
MediaCodec encoder = MediaCodec.createEncoderByType("video/avc"); int iColorFormat = selectColorFormat(encoder.getCodecInfo(), "video/avc"); MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 1280, 800); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 16000000); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, iColorFormat); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 15); encoder.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); encoder.start(); MediaMuxer muxer = new MediaMuxer(uriFile.getPath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); muxer.addTrack(encoder.getOutputFormat()); muxer.start(); try { muxer.stop(); } catch (Exception ex) { }
抛出的异常
java.lang.IllegalStateException: Failed to stop the muxer Stacktrace: android.media.MediaMuxer.nativeStop(Native Method) android.media.MediaMuxer.stop(MediaMuxer.java:454)
原因解析
- MediaMuxer内部有严格的状态机控制,仅调用
start()后,它处于预备初始化状态,还没完成媒体容器的基础结构写入(比如MP4格式的moov核心原子),此时不满足停止的状态校验要求。 - 调用
muxer.writeSampleData()写入有效媒体数据后,Muxer会完成轨道参数初始化、容器头部信息写入,进入稳定工作状态,这时调用stop()才能触发正确的收尾流程——比如写入媒体索引、完善容器的完整结构。 - 底层native层的
stop方法会校验是否有过有效数据写入,若未写入任何数据则直接抛出异常,这是系统为了避免生成无法被播放器识别的空媒体文件而做的限制。
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

