Media start error原因分析及解决方法

之前在项目的时候,遇到到Media Recorder在快速启动停止等一系列操作的后,再次启动时,会failed的问题,类似的Log如下:

 

ERROR/MediaRecorder(9008): start failed: -19                                                                            
WARN/dalvikvm(9008): threadid=15: thread exiting with uncaught exception (group=0x40ad01f8)                             
ERROR/AndroidRuntime(9008): FATAL EXCEPTION: Thread-337                                                                 
ERROR/AndroidRuntime(9008): java.lang.RuntimeException: start failed.                                                   
ERROR/AndroidRuntime(9008):     at android.media.MediaRecorder.start(Native Method)                                     
ERROR/AndroidRuntime(9008):     at com.huawei.ca.eivs.camera.AndroidVideo.initMediaRecoder(AndroidVideo.java:429)       
ERROR/AndroidRuntime(9008):     at com.huawei.ca.eivs.camera.AndroidVideo.sendLiveToMdu(AndroidVideo.java:511)          
ERROR/AndroidRuntime(9008):     at com.huawei.ca.eivs.camera.AndroidVideo$ListenInviteThread.run(AndroidVideo.java:241) 
WARN/ActivityManager(210):   Force finishing activity com.huawei.ca.eivs.ui/com.huawei.ca.eivs.camera.AndroidVideo      
ERROR/ActivityManager(210): exception bw.write()java.io.IOException: Transport endpoint is not connected                

 

这个时候,退出自己的软件,打开系统相机,会提示“相机故障,无法连接到相机”,只能重启机器才能正常使用系相机。

 

根据反复测试抓log发现,造成MediaRecorder start失败的原因是:在程序中反复启动停止MediaRecord时,存在在无效的状态上stop MediaRecorder的情况,而且没有捕获此操作引发的异常,没有对MediaRecorder进行reset、release造成的。

 

具体的MediaRecorder状态迁移,请参看SDK。 

 

解决办法:
解决这个问题的关键是保证MediaRecorder能在合适的状态执行合适的动作。


下面是我的解决方法,希望能给遇到这个问题的人一个灵感:

 

private void releaseMediaRecorder()
    {
        if (mMediaRecorder != null)
        {
            // 内部标识是否正在录像的变量,如果不需要可以去掉
            if (isRecord)
            {
                try
                {
                    mMediaRecorder.setOnErrorListener(null);
                    mMediaRecorder.setOnInfoListener(null);
                    // 停止
                    mMediaRecorder.stop();
                   
                }
                catch (RuntimeException e)
                {
                    e.printStackTrace();
                   
                    // 如果发生异常,很可能是在不合适的状态执行了stop操作
                    // 所以等待一会儿
                    try
                    {
                        Thread.sleep(100);
                    }
                    catch (InterruptedException e1)
                    {
                        Log.e(TAG, "sleep for second stop error!!");
                    }
                }
                isRecord = false;
            }
           
            // 再次尝试停止MediaRecorder
            try
            {
                mMediaRecorder.stop();
            }
            catch (Exception e)
            {
                Log.e(TAG, "stop fail2", e);
            }
           
            // 等待,让停止彻底执行完毕
            try
            {
                Thread.sleep(100);
            }
            catch (InterruptedException e1)
            {
                Log.e("TAG", "sleep for reset error Error", e1);
            }
           
            // 然后再进行reset、release
            mMediaRecorder.reset();
            mMediaRecorder.release();
           
            mMediaRecorder = null;
        }
    }

 

这是我经历痛苦后的总结,希望能对遇到类似问题的同伴有点帮助~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值