MediaRecorder:停止失败:-1007

时间:2018-05-03 13:27:41

标签: java android camera video-recording

我正在尝试使用“旧”相机api(不是相机2)实现视频录制,最近我遇到了一个我无法解决的错误( 问题是当我调用stop()方法停止记录应用程序崩溃时。 Start()工作正常,我无法弄清楚问题是什么。该应用拥有所有权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-feature android:name="android.hardware.camera.front" android:required="true"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/>

CameraPreview类如下所示:

public class CameraHelperOld extends SurfaceView implements SurfaceHolder.Callback {


private final String mVideoPath;
Camera mCamera;
private MediaRecorder mMediaRecorder;

public CameraHelperOld(Context context, String videoPath) {
    super(context);
    try {
        mCamera = Camera.open(0);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mVideoPath = videoPath;

    this.getHolder().addCallback(this);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

        mMediaRecorder = new MediaRecorder();

        CamcorderProfile profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH);

        mCamera.unlock();
        mMediaRecorder.setCamera(mCamera);

        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

        mMediaRecorder.setProfile(profile);

        mMediaRecorder.setOutputFile(mVideoPath);

        mMediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
            @Override
            public void onError(MediaRecorder mr, int what, int extra) {
                Log.d("Error","error");
            }
        });
        mMediaRecorder.setPreviewDisplay(this.getHolder().getSurface());

        try {
            mMediaRecorder.prepare();
            mMediaRecorder.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    try {
        mMediaRecorder.stop();
    } catch (RuntimeException e) {
        e.printStackTrace();
    }
    mMediaRecorder.reset();
    mMediaRecorder.release();

    mCamera.stopPreview();
    mCamera.release();
}

}

我在surfaceDestroyed()中调用了Stop()方法 - 这绝对不是问题,因为我是从不同的地方调用它。

现在,我已经尝试了我找到的所有解决方案建议,但没有一个有效。谁能解释一下这种行为的原因是什么?

BTW,我正在使用Nexus 5 LG。

我成功地使用Camera2 API实现了视频录制,但我需要该应用程序才能使用旧的Camera API,因为我需要支持KitKat和较旧的Android设备。

提前致谢!

0 个答案:

没有答案