MediaRecorder.start()的IllegalStateException:null

时间:2014-04-09 15:47:39

标签: android illegalstateexception mediarecorder android-mediarecorder

我正在尝试创建一个简单的录像机,这是我的代码,以便我称之为:

protected boolean prepareForVideoRecording() {
    try {
        mCamera.unlock();
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
        mMediaRecorder.setOutputFile(getOutputMediaFile1(MEDIA_TYPE_VIDEO).toString());
        mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
        try {
            mMediaRecorder.prepare();
            Toast.makeText(getContextOfMainFragment(), "Prepared!", Toast.LENGTH_SHORT).show();
        } catch (IllegalStateException e) {
            Log.e(TAG,"IllegalStateException when preparing MediaRecorder "+ e.getMessage());
            e.getStackTrace();
            releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            Log.e(TAG,"IOException when preparing MediaRecorder "+ e.getMessage());
            e.getStackTrace();
            releaseMediaRecorder();
            return false;
        }
        return true;

    } catch (Exception e) {
        return false;
    }
}

请忽略吐司消息,我有时会使用它们进行调试。接下来,唯一剩下的就是调用mMediaRecorder.start() 我按下按钮即可完成此操作。事实上,我已经添加了2个按钮,第一个按钮调用上面的方法,另一个按钮进行启动调用。我确信这个代码一次对我有用,我不知道为什么它不再起作用了。

我在我的mMediaRecorder.start()调用中添加了一个try catch,带有IllegalStateException,这是我得到的:

04-09 10:38:18.350: E/MediaRecorder(29678): start failed: -38
04-09 10:38:18.350: E/VideoTut_Main(29678): Illegal state exception with MediaRecorder.Start() :  null

1 个答案:

答案 0 :(得分:3)

我在blog中写了一篇关于这类问题的长篇文章。总结一下(至少据我所知)有三种设置Android mediarecorder的方法,对于每种方法,我手上都有一个设备,这个方法不起作用。因此,您需要用户尝试在他的设备上使用哪种方法。方法如下:

  1. 将设备默认设置用于视频大小,预览尺寸等,但是在介质记录器中明确将视频大小设置为您从开始后的相机参数获得的预览大小预览窗口,但之前解锁相机进行录制。
  2. 像在代码中一样使用摄像机配置文件。它应该在大多数具有Android 4.0及更高版本的设备上完美运行。我建议设置最大文件大小和视频长度,但怀疑这是Nexus 5的问题。我知道至少有一个其他设备(Xperia ray升级到最新的固件版本),这不起作用。
  3. 使用您从相机参数getSupportedVideoSizes()获得的其中一种显式视频尺寸。
  4. 方法1.和3.要求明确设置输出格式,音频编码器和视频编码器,我总是使用MediaRecorder.OutputFormat.THREE_GPPMediaRecorder.AudioEncoder.AMR_NBMediaRecorder.VideoEncoder.MPEG_4_SP

    我在Google Play中有一个名为Video Timer的小型免费应用,它已经实现了所有这三种方法,因此您可以轻松试用适用于Nexus 5的方法。