是否有必要在MediaRecorder.start()之前调用Camera.stopPreview()?

时间:2016-03-24 11:15:43

标签: android android-camera video-capture

我正在使用MediaRecorder使用基本的Camera应用程序。应用程序在TextureView上预览视频,当单击按钮时,它开始录制。我在大多数手机上工作,但在某些特定设备上,底层OMX失败了:

(40b1df38)   hardware/ti/omap4xxx/camera/OMXCameraAdapter/OMXCameraAdapter.cpp:2176 UseBuffersPreview - Exiting function UseBuffersPreview because of ret 0 eError=80001018

因此,预览冻结和录制失败。

我发现这很可能是在Camera对象仍在预览时引起的,而MediaRecorder对象则开始录制。当我在开始录制之前调用mCamera.stopPreview()时,它可以工作。因此,我有以下问题: 1.为什么在某些设备上调用mCamera.stopPreview(),而不是在其他设备上? 2.如果调用Camera对象上的stopPreview()但是MediaRecorder.setPreviewDisplay()不是?

,如何仍然预览录制的视频?

下面我提供一些代码:

public boolean startRecording() throws IllegalStateException, IOException {
    if (!mRecordingStarted) {

        mMediaRecorder = new MediaRecorder();
        try {
            mCamera.stopPreview(); // !!! without this recording fails on some devices!
            mCamera.unlock();
            mMediaRecorder.setCamera(mCamera);

            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);                mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
            mMediaRecorder.setProfile(mCamProfile);

            //mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());

            mMediaRecorder.setOutputFile(mCaptureFile);
            mMediaRecorder.prepare();
            mMediaRecorder.start();
            mRecordingStarted = true;
        } catch (Exception e) {
            mMediaRecorder.release();
            mCamera.lock();
            Log.e("ERROR", e.toString());
        }
    }
    return mRecordingStarted;
}


private void startPreview() throws IllegalStateException, IOException {
    if (mCamera == null) {
        return;
    }
    try {
        mCamera.stopPreview();
    } catch (Exception e) {
    }

    Camera.Parameters parameters = mCamera.getParameters();
    mCamera.setDisplayOrientation(0);
    mCamProfile = getConfiguredProfile();
    mVideoSize = getBestPreviewSize(mCamProfile, parameters);
    parameters.setPreviewSize(mVideoSize.width, mVideoSize.height);
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

    mCamera.setParameters(parameters);
    mCamera.setPreviewTexture(mPreview.getSurfaceTexture());
    mCamera.startPreview();
}

0 个答案:

没有答案