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

Camera2 API中MediaRecorder stop()调用失败问题求助

Android Camera2 + MediaRecorder stop() 抛出"stop failed"异常排查方案

核心排查方向及解决步骤

1. MediaRecorder 状态管理错误

调用stop()前必须确保MediaRecorder处于活跃录制状态。常见问题是第一次停止后未正确重置实例,导致第二次录制时状态混乱:

  • 每次停止录制后,务必调用mediaRecorder.reset() + mediaRecorder.release()(或至少reset()),第二次录制前重新初始化所有配置(输出路径、编码格式、Surface绑定等),不要复用旧的MediaRecorder实例。
  • 用布尔变量(如isRecording)标记当前状态,点击停止按钮时先判断状态,避免在未录制时调用stop()。

2. CaptureSession 与 MediaRecorder 操作顺序错误

停止录制的流程必须严格遵循先切回预览,再停MediaRecorder的顺序:

  1. 发送预览模式的CaptureRequest到CaptureSession
  2. 在CaptureSession.CaptureCallback的onCaptureCompleted回调中,确认预览帧已输出
  3. 再调用mediaRecorder.stop()
    如果直接调用stop()而未切换预览,MediaRecorder会因等待Camera帧超时或数据中断触发异常。

3. 文件与权限问题

虽然prepare()和start()成功,但停止时可能因文件系统异常失败:

  • 每次录制使用唯一的输出文件名,避免覆盖文件时出现锁冲突;检查路径是否存在、是否有写入权限(Android 10+注意分区存储适配,不要直接写入公共目录)。
  • 捕获stop()时的IOException,打印详细错误信息(如e.getMessage()),排查是否是文件写入失败导致。

4. CaptureSession 状态异常

如果CaptureSession在录制过程中意外关闭(如后台被抢占、设备休眠),MediaRecorder会因失去帧源而停止失败:

  • 在CameraCaptureSession.StateCallback的onClosed回调中标记Session失效状态,禁止在Session失效时调用mediaRecorder.stop()。
  • 确保录制过程中Camera实例未被释放,不要在后台时主动释放Camera资源。

5. 配置参数不匹配

MediaRecorder的分辨率、帧率必须与Camera支持的输出格式一致:

  • 通过CameraCharacteristics获取Camera支持的视频输出尺寸(SCALER_STREAM_CONFIGURATION_MAP)和帧率范围,确保MediaRecorder的配置在支持范围内。
  • 避免设置Camera不支持的编码格式(比如部分设备不支持H.265),优先使用Camera默认推荐的格式。

调试技巧

  • 打印stop()异常的完整堆栈:
    try {
        mediaRecorder.stop();
    } catch (IllegalStateException | IOException e) {
        Log.e("VideoRecorder", "Stop failed", e); // 打印完整堆栈定位原因
    }
    
  • 不要在主线程调用MediaRecorder的stop()/start(),建议放在后台线程执行,避免主线程阻塞导致状态异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:22:50