MediaMuxer Stop抛异常崩溃

在Android开发中,使用MediaMuxer进行多媒体文件录制时,遇到停止(stop)操作抛出IllegalStateException。崩溃日志显示与MediaCodec编码器和codec特定数据有关。错误提示'initAddtionalStyle default'和'Missing codec specific data'表明问题可能在于MediaMuxer.addTrack的调用时机。解决方法是在MediaCodec开始编码并返回dequeueOutputBuffer后调用addTrack。
摘要由CSDN通过智能技术生成

java.lang.IllegalStateException: Failed to stop the muxer
at android.media.MediaMuxer.nativeStop(Native Method)
at android.media.MediaMuxer.stop(MediaMuxer.java:225)

MediaMuxer在录制完成时调用stop接口抛异常崩溃,往上翻看崩溃日志有两行下面的错误

E/textview: initAddtionalStyle default
E/MPEG4Writer: Missing codec specific data


这个异常跟编码器有关,到网上查找资料,看别人写的代码,发现是调用MediaMuxer.addTrack的时机不对;


MediaMuxer.addTrack应该在编码器MediaCodec编码过程开始,dequeueOutputBuffer返回

INFO_OUTPUT_FORMAT_CHANGED状态时才调用


基本流程应该是(示意代码)

1.初始化各对象
_mediaMuxer = new MediaMuxer(...);
_videoEncoder = MediaCodec.createEncoderByType(...);
_videoEncoder.configure(...);
_videoEncoder.start();
MediaMuxer是一个非常好的录像库,它能将H.264视频+AAC音频存储成.mp4格式的文件,而且稳定性、同步效果都非常好。在使用MediaMuxer进行音视频同步时,需要注意以下几点: 1. 首先需要创建一个MediaMuxer对象,并指定输出文件的路径和格式。 2. 然后需要创建一个MediaFormat对象,用于指定音频或视频的编码格式、采样率、码率等参数。 3. 接着需要调用MediaMuxer的addTrack方法将音频或视频的MediaFormat对象添加到MediaMuxer中。 4. 然后需要调用MediaMuxer的start方法开始合成音视频。 5. 接着需要将音频或视频的数据写入MediaMuxer中,可以使用MediaCodec进行编码,然后将编码后的数据写入MediaMuxer中。 6. 最后需要调用MediaMuxerstop和release方法停止合成音视频并释放资源。 下面是一个使用MediaMuxer进行音视频同步的示例代码: ```java MediaMuxer mediaMuxer = new MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); int videoTrackIndex = -1; int audioTrackIndex = -1; MediaFormat videoFormat = null; MediaFormat audioFormat = null; // 添加视频轨道 videoTrackIndex = mediaMuxer.addTrack(videoFormat); // 添加音频轨道 audioTrackIndex = mediaMuxer.addTrack(audioFormat); // 开始合成音视频 mediaMuxer.start(); // 将视频数据写入MediaMuxer中 ByteBuffer videoBuffer = ByteBuffer.allocate(videoSize); mediaMuxer.writeSampleData(videoTrackIndex, videoBuffer, videoBufferInfo); // 将音频数据写入MediaMuxer中 ByteBuffer audioBuffer = ByteBuffer.allocate(audioSize); mediaMuxer.writeSampleData(audioTrackIndex, audioBuffer, audioBufferInfo); // 停止合成音视频并释放资源 mediaMuxer.stop(); mediaMuxer.release(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值