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的顺序:
- 发送预览模式的
CaptureRequest到CaptureSession - 在
CaptureSession.CaptureCallback的onCaptureCompleted回调中,确认预览帧已输出 - 再调用
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
相关产品推荐
相关产品推荐

