MediaRecorder: start failed: -22报错的原因和解决方法

本文记录了使用MediaRecorder进行视频录制时遇到的异常问题及解决办法。重点介绍了正确的API调用顺序,以避免出现如MediaRecorder:startfailed等异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天在优化相机这块的时候,看了下系统相机的源码,copy了部分用MediaRecorder来进行录制的代码出来,调用start的时候一直抛异常:

MediaRecorder: start failed: -22

想了好久也不知道什么,浪费了很长时间之后去百度了一下MediaRecorder详细信息和用法,最后才发现问题出来了初始化MediaRecorder的时候的调用顺序上,MediaRecorder的API是有顺序的,不按顺序来就会抛异常,坑爹,特此记录一下。一般的API使用顺序为

        try {
        //要在实例化MediaRecorder之前就解锁好相机
        mCamera.unlock();
        mMediaRecorder = new MediaRecorder();
        //将相机设置给MediaRecorder
        mMediaRecorder.setCamera(mCamera);
        // 设置录制视频源和音频源
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        // 设置录制的视频编码和音频编码
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
        mMediaRecorder.setVideoSize(1920, 1080);
        // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoEncodingBitRate(1024*1024*20);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
        // 设置视频文件输出的路径
        mMediaRecorder.setOutputFile( "/sdcard/lllllll.mp4");
        //暂停住   在外面就可以调用start进行录制了
        mMediaRecorder.prepare();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    之前还遇到过MediaRecorder: start failed: -19的 这个错误是因为我们没在实例化MediaRecorder之前解锁相机导致





### Java.lang.RuntimeException: stop failed 错误分析 当调用 `MediaRecorder.stop()` 方法时发生错误并抛出 `Java.lang.RuntimeException: stop failed` 的原因可能有多种情况。通常这类问题发生在 Android 应用程序中录制视频或音频的过程中。 #### 可能的原因解决方案 1. **资源未正确初始化** 如果 MediaRecorder 对象没有被正确配置就尝试停止录音,则会触发此异常。确保在调用 `start()` 前已经完成了所有的设置工作,包括指定输出文件路径等必要参数[^1]。 2. **重复启动或释放操作不当** 当多次连续调用了 `prepare()` 或者在一次完整的生命周期内(即 start-stop-release)之外再次试图执行这些方法也会引发该异常。因此,在每次使用完毕之后应当立即调用 `release()` 来释放资源,并将对象置为空指针以防意外重入[^4]。 3. **权限不足** 自 Android 6.0 (API level 23) 起引入了动态权限机制,如果应用程序缺少必要的存储写入或其他相关权限也可能导致失败。检查应用清单文件中的声明以及运行期间请求用户授权的状态[^2]。 4. **外部因素影响** 设备上的其他进程占用摄像头设备或者其他硬件接口可能导致当前 session 中断从而造成无法正常结束记录过程而报错。可以考虑增加 try-catch 结构捕获潜在的风险并在日志里记录下来以便排查具体位置[^5]。 ```java try { if(mediaRecorder != null){ mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; if(camera != null){ camera.release(); camera = null; } } } catch(IllegalStateException e) { Log.e(TAG, "Error stopping recorder", e); } ``` 通过以上措施应该能够有效减少甚至消除此类异常的发生频率。同时建议开发者们养成良好的编程习惯,比如遵循官方文档指导来构建管理媒体组件实例的生命期;另外就是利用调试工具仔细查看堆栈跟踪信息找出根本所在之处加以修正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值