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

Media3 Mp4Muxer与FragmentedMp4Muxer抛出IllegalStateException问题

问题分析与解决方案

核心问题

从MediaMuxer迁移至Media3的FragmentedMP4Muxer/MP4Muxer后,混流相机视频+麦克风音频轨道时,录制30-60秒会随机触发IllegalStateException,短时长(如10秒)录制正常。异常源于断言track.pendingSamplesByteBuffer.size() == track.pendingSamplesBufferInfo.size()失败。

异常触发位置

  • MP4Muxer:MP4Writer.java的flushPending方法
    private void flushPending(Track track) throws IOException {
        checkState(track.pendingSamplesByteBuffer.size() == track.pendingSamplesBufferInfo.size()); // 触发位置
        ...
    }
    
  • FragmentedMP4Muxer:FragmentedMP4Writer.java的processTrack方法
    private ProcessedTrackInfo processTrack(int trackId, Track track) {
        checkState(track.pendingSamplesByteBuffer.size() == track.pendingSamplesBufferInfo.size()); // 触发位置
        ...
    }
    

异常堆栈

java.lang.IllegalStateException at androidx.media3.common.util.Assertions.checkState(Assertions.java:85)
at androidx.media3.muxer.FragmentedMp4Writer.processTrack(FragmentedMp4Writer.java:296)
at androidx.media3.muxer.FragmentedMp4Writer.processAllTracks(FragmentedMp4Writer.java:289)
at androidx.media3.muxer.FragmentedMp4Writer.createFragment(FragmentedMp4Writer.java:239)
at androidx.media3.muxer.FragmentedMp4Writer.writeSampleData(FragmentedMp4Writer.java:126)
at androidx.media3.muxer.FragmentedMp4Muxer.writeSampleData(FragmentedMp4Muxer.java:185)
at xx.xx.encoder.VideoEncoderCore.drainVideoEncoder(VideoEncoderCore.java:374)
at xx.xx.TextureMovieEncoder.handleFrameAvailable(TextureMovieEncoder.java:1401)

排查方向与修复建议

  • 线程安全校验:Media3的Muxer类并非线程安全,若视频、音频轨道的采样数据在不同线程写入,会导致两个队列添加操作不同步。确保所有writeSampleData调用在同一线程执行,或通过锁机制同步写入逻辑。
  • 采样配对检查:确认每次调用writeSampleData时,ByteBuffer与MediaCodec.BufferInfo是严格配对传入的,不存在只添加其中一个参数的情况。检查编码器drainVideoEncoder及音频编码器的drain逻辑,保证每一份采样数据的两个参数都完整写入。
  • 编码器异常监听:排查编码器是否存在异常中断(如视频丢帧、音频采样丢失),导致某一轨道的采样数据不完整。添加MediaCodec的错误回调监听,捕获编码过程中的异常情况。
  • 版本升级验证:部分旧版本Media3的FragmentedMP4Muxer在处理高帧率/高比特率视频时存在采样队列不同步的bug,尝试升级至最新稳定版(如1.2.x及以上),确认是否修复该问题。
  • 片段创建时机调整:FragmentedMP4Muxer创建片段时会遍历处理所有轨道的pending采样,若此时某轨道正处于采样写入过程,会导致队列状态不一致。可调整片段创建时机,或在创建片段时暂停采样数据的写入。

内容的提问来源于stack exchange,提问作者GhostCoder77

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:44:55