`

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;
        }
    }

 

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

分享到:
评论
2 楼 diyangxia 2014-04-15  

看起来比较靠谱
1 楼 whhpc19891120 2013-04-25  
大哥,还是用了你的方法问题还是存在

相关推荐

    android Media分析

    3. **创建HandleEventHandler和事件处理**: `MEDIA_PREPARED`, `MEDIA_PLAYBACK_COMPLETE`, `MEDIA_BUFFERING_UPDATE`, `MEDIA_SEEK_COMPLETE`, `MEDIA_SET_VIDEO_SIZE`, `MEDIA_ERROR`, `MEDIA_INFO`, `MEDIA_TIMED...

    Android Studio 视频播放失败 start called in state1 异常怎么解决

    每个状态都有特定的操作对应,比如只能在PREPARED状态下调用`start()`方法。当收到“start called in state 1”错误时,这意味着在不适当的状态下尝试启动播放。 以下是处理该异常的一些步骤: 1. **正确初始化**...

    param_ctor.rar_The Media

    标题中的"param_ctor.rar_The Media"提示我们关注的是与媒体处理相关的Java Android代码,特别是MediaRecorder类。MediaRecorder是Android系统中用于音频、视频录制的核心组件,它允许开发者将设备传感器捕获的数据...

    MediaEx.zip_The Exception

    try { // create a player to play the media specified in the ...mediaPlayer.start() // start playing the media clip } catch (Exception iOException) { System.err.println("Error reading from the source") }

    android音乐播放器MediaPlayer

    然后,播放音乐需要调用`mediaPlayer.start()`方法。但在开始播放之前,我们需要确保准备就绪,这可以通过监听`OnPreparedListener`来实现: ```java mediaPlayer.setOnPreparedListener(new MediaPlayer....

    webtrends移动终端应用用户行为监控分析方案

    ### Webtrends移动终端应用用户行为监控分析方案详解 #### 一、概述 Webtrends推出的移动终端应用用户行为监控分析方案,旨在帮助企业深入了解移动应用内的用户行为,从而提升用户体验和应用价值。该方案适用于多...

    android多媒体本地播放流程

    `prepareAsync()`方法用于异步准备媒体资源,而`start()`方法则启动播放。这两个方法是多媒体播放流程中的关键步骤。 ##### prepareAsync() 此方法会触发一系列内部操作,包括解码器初始化、缓冲区分配等准备工作。...

    RxScreenCapture:带有Media Projection和Rx的Android屏幕捕获

    - **创建Observable**: 使用`MediaProjection`的`start()`方法创建一个数据流,然后通过`rxJava`的`Observable.create()`方法包装成可观察对象。 - **订阅和处理数据**: 创建一个`Observer`来处理屏幕数据,比如将每...

    storcli常用命令使用手册.docx

    使用 `storcli64 -PDList -aALL` 命令可以查看磁盘的健康状态,包括 Slot Number、Media Error Count、Other Error Count、Predictive Failure Count 和 Firmware state 等信息。 1.5.2 查看磁盘详细信息 使用 `...

    GetWebPics专业版2.9

    You can start downloading pictures (or other media content) quickly, simply after inputting the address of the first page with gallery. Smart page analyzer will follow every link on the page or script...

    BURNINTEST--硬件检测工具

    - 32-bit BurnInTest PRO 5.3.1020 would not start on Windows 2000. This has been corrected. Release 5.3 build 1020 WIN32 release 29 May 2008 - BurnInTest could have crashed on accessing bad video ...

    LIVE555 拉取H264 按每帧读取数据流(三)

    1. **LIVE555库介绍**:LIVE555 Streaming Media库提供了实现RTSP(Real-Time Streaming Protocol)、RTP(Real-time Transport Protocol)和RTCP(Real-time Transport Control Protocol)所需的基本组件。...

    基于MediaPlayer的音频播放代码

    使用`start()`方法来开始播放音频: ```java mediaPlayer.start(); ``` 3. **暂停播放** 要暂停音频,调用`pause()`方法: ```java mediaPlayer.pause(); ``` 4. **停止播放** 当不再需要播放时,释放...

    jmf 设置声音和视频选项,并实现录像功能

    例如,`start`方法开始播放或录制,`stop`方法停止当前操作。 7. **事件处理**: JMF支持事件驱动编程,通过监听`ControllerListener`、`ErrorListener`等事件,可以实时响应播放和录制过程中的状态变化,如开始、...

    HTML5混合开发二维码扫描以及调用本地摄像头

    console.log('Error accessing media devices', err); }); ``` 这段代码会打开摄像头,并将视频流显示在一个`<video>`元素上。这是实现二维码扫描的基础。 接下来,我们需要一个库或API来解析摄像头捕捉到的图像...

    Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小

    2. 开始录音:调用`startRecording()`方法启动录音。 3. 数据读取:通过`read()`方法读取缓冲区中的音频数据。 4. 结束录音:调用`stop()`方法停止录音,并释放`AudioRecord`资源。 实时获取音量大小通常需要计算...

    hls.min.js

    var i={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",MUX_ERROR:"muxError",OTHER_ERROR:"otherError"},a={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",...

    andorid jni

    - `bionic`, `build`, `development`, `frameworks`, `Makefile`, `packages`, `start.sh`, `tools`, `bootable`, `dalvik`, `external`, `hardware`, `out`, `prebuilts`, `system`, `vendor` 2. **执行编译** -...

    MediaPlayer

    - **开始播放**:调用`mediaPlayer.start()`方法启动播放。 - **暂停**:使用`mediaPlayer.pause()`暂停当前播放。 - **停止并重置**:`mediaPlayer.stop()`停止播放,`mediaPlayer.reset()`将MediaPlayer恢复到初始...

Global site tag (gtag.js) - Google Analytics