You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:20