视频录制 - 无法启动相机预览

时间:2011-10-10 20:36:24

标签: android video camera mediarecorder

我正在制作一个自定义视频录制课程,我在使用“活动”第一次出现时让相机预览显示出来时遇到了一些问题。我在surfaceCreated回调中调用了这个函数:

private void initRecorder(Surface surface) throws IOException {
// It is very important to unlock the camera before doing setCamera
// or it will results in a black preview
if(camera == null) {
    camera = Camera.open();
    camera.unlock();
}

if(recorder == null)
    recorder = new MediaRecorder();

recorder.setPreviewDisplay(surface);
recorder.setCamera(camera);

camera.startPreview();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setOutputFile("/sdcard/test.mp4");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoEncodingBitRate(15000000);
recorder.setMaxDuration(10000); // length of video in MS
recorder.setVideoSize(720, 480);
recorder.setVideoFrameRate(30);


try {
    recorder.prepare();
} catch (IllegalStateException e) {
    // This is thrown if the previous calls are not called with the 
    // proper order
    e.printStackTrace();
}
}

活动开始时,我的应用程序崩溃说:

java.lang.RuntimeException: startPreview failed

在错误之上,我注意到一句话:

attempt to use a locked camera from a different process (old pid 4894, new pid 6405)

当我单步执行代码时,camera.startPreview()行发生了错误。如果我从代码中删除该行,则在我调用recorder.start()后预览显示正常,在此之前我只有一个带有记录按钮的黑屏。一旦我停止录制,预览继续显示正常(我在停止录制后呼叫camera.startPreview())。

由于我在开始预览之前只调用了camera.unlock()几行,并且两个调用都出现在同一个函数中,我怎么能出现这个错误?

编辑:我测试了相同的代码,减去了对Droid X2和Droid 1上startPreview()的调用,它运行正常。看起来EVO 4G就是问题所在。我会继续调查。

3 个答案:

答案 0 :(得分:0)

排列这样的代码并降低视频编码率。视频大小非常高。这可能不会在您的设备上造成问题,因为在某些设备上它会被内部剪裁。

private void initRecorder(Surface surface) throws IOException {
    // It is very important to unlock the camera before doing setCamera
    // or it will results in a black preview
    if (camera == null) {
        camera = Camera.open();
        camera.unlock();
    }

    if (recorder == null)
        recorder = new MediaRecorder();

    recorder.setCamera(camera);

    camera.startPreview();

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    recorder.setVideoEncodingBitRate(2048000);
    recorder.setMaxDuration(10000); // length of video in MS
    recorder.setVideoSize(720, 480);
    recorder.setVideoFrameRate(30);
    recorder.setOutputFile("/sdcard/test.mp4");
    recorder.setPreviewDisplay(surface);
    try {
        recorder.prepare();
    } catch (IllegalStateException e) {
        // This is thrown if the previous calls are not called with the
        // proper order
        e.printStackTrace();
    }
}

答案 1 :(得分:0)

我在这里回答了一个非常相似的问题:preview display in android media recorder

看看它是否对您有所帮助,它有一个完整的活动,可用于预览并录制视频。

答案 2 :(得分:0)

camera.unlock()必须从之前锁定相机的同一线程中调用。检查您的日志中是否有Unlock call from pid 19322; currently locked to pid 17652之类的消息。

请注意,可以通过调用Camera.lock()MediaRecorder.start()

来设置锁定
  

自API级别14开始,相机自动锁定   MediaRecorder.start()。应用程序可以使用相机(例如:变焦)   录制开始后。录制后无需调用此   开始或停止。