没有调用相机onPreviewFrame

时间:2011-08-12 15:23:03

标签: android video camera

使用Camera.PreviewCallback实现时,初始化相机并开始预览(Camera.startPrevew())后,onPreviewFrame会被无故障地调用。问题是,如果我使用MediaRecorder onPreviewFrame进行视频录制,则不再调用。

据我所知,当使用MediaRecorder录制视频时会停止Camera.PreviewCallback,但为什么不能重启?

我已经尝试重置相机预览回调(setPreviewCallback(回调))并重新启动startPreview,但是当我有预览时,没有调用onPreviewFrame。

4 个答案:

答案 0 :(得分:16)

您必须在surfaceChanged方法中调用setPreviewCallback,而不仅仅是在surfaceCreated中。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mHolder.getSurface() == null){
  return;
}

try {
    mCamera.stopPreview();
} catch (Exception e){
  // ignore: tried to stop a non-existent preview
}

try {
    mCamera.setPreviewCallback(this);
    mCamera.setPreviewDisplay(mHolder);
    mCamera.startPreview();

} catch (Exception e){
    Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}

答案 1 :(得分:9)

我有类似的问题;见

setOneShotPreviewCallback not hitting onPreviewFrame() in callback

我发现在调用Camera#unlock()准备MediaRecorder后,必须在设置预览回调之前调用Camera#reconnect()。这是因为Camera.unlock()将相机从进程中分离出来,让MediaRecorder连接到它。

http://developer.android.com/reference/android/hardware/Camera.html#unlock()

在我的调查中,我还发现如果使用除单击方法之外的其他方法设置任何预览回调,则必须在调用Camera#reconnect()之后重置所有这些。所以,简单地说:

mCamera.unlock();
//set up MediaRecorder
mCamera.reconnect();
mCamera.setPreviewCallback(mCallback);
//or whatever callback method you want to use
//and even if you've set this callback already

我希望有所帮助!

答案 2 :(得分:4)

你应该在previewCallBacks()接口的新实例化中调用它,如下面的

public void surfaceCreated(SurfaceHolder holder) {
        // if (mediaRecorder == null) {
        try {
            camera = Camera.open();
            camera.setPreviewCallback(new PreviewCallback() {
                public void onPreviewFrame(byte[] _data, Camera _camera) {
                }
            }
        }
}

答案 3 :(得分:0)

拍摄视频或照片后,您需要再次调用startPreview()。

相关问题