Android视频录制 - mediaRecorder.start上的IllegalStateException

时间:2015-09-21 12:05:40

标签: android android-camera android-mediarecorder

我正在关注https://developer.android.com/guide/topics/media/camera.html#capture-video

上的教程

因此,我在尝试启动相机时遵循以下顺序:

  1. Camera.open
  2. camera.unlock
  3. mediaRecorder.setCamera
  4. mediaRecorder.setAudioSource
  5. mediaRecorder.setVideoSource
  6. mediaRecorder.setProfile
  7. mediaRecorder.setOutputFile
  8. mediaRecorder.prepare
  9. mediaRecorder.start< - 这是我收到IllegalStateException的地方
  10. 我可以找出可能出现的问题,因为我按照指南操作,运行5.0.2

    private Camera mCamera;
    private MediaRecorder mMediaRecorder;
    
    public CameraActivity() {
        mCamera = getCameraInstance();
        mMediaRecorder = new MediaRecorder();
    }
    
    public static Camera getCameraInstance(){
        Camera c = null;
        try {
            c = Camera.open();
        }
        catch (Exception e) { ... }
        return c;
    }
    
    public void startRecording() {
    
        mCamera.unlock();
        mMediaRecorder.setCamera(mCamera);
    
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
        mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
    
        try {
            mMediaRecorder.prepare();
        }
        catch (IOException e) { ... }
        catch (IllegalStateException e) { ... }
    
        try {
            mMediaRecorder.start();
        }
        catch (Exception e) {
            Log.d(TAG, "exception on mediaRecorder.start" + e.toString()); // This is the exception that gets thrown on .start
        }
    }
    

    我的清单包含所有必要的权限

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.microphone" />
    

    我也试过手动设置格式而不是使用.setProfile,结果相同

        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
    

    更新

    该文件确实已创建,但它当然无法播放,所以我知道它正在努力实现这一点。对prepare的调用不会抛出异常,并且在启动之前发生。在start()

    上抛出相同的异常

2 个答案:

答案 0 :(得分:3)

比较我的代码,似乎你错过了两个电话:

mediaRecorder.setVideoSize(int width, int height)
mediaRecorder.setPreviewDisplay(SurfaceHolder surfaceHolder)

后者最有可能导致崩溃,因为Android需要有效的预览曲面才能开始录制。这样做是为了防止隐藏的相机应用程序。

有许多与没有预览曲面的录制相关的问题,但是这个one似乎总结了你需要做些什么来绕过这个限制。 基本思路是将表面大小调整为1x1并将其传递给mediaRecorder实例。请记住,这可能不适用于所有设备。

答案 1 :(得分:0)

如果您多次访问麦克风硬件,例如一次使用MediaRecorder和AudioRecord类,也会出现此异常。