没有调用相机onPreviewFrame

ess*_*sse 24 video camera android

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

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

我曾尝试重置相机预览回调(setPreviewCallback(回调))并重新启动startPreview,但同时我有一个预览出现到onPreviewFrame没有呼叫.

Neo*_*gma 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());
}
}
Run Code Online (Sandbox Code Playgroud)


And*_*yld 10

我有类似的问题; 看到

setOneShotPreviewCallback没有在回调中击中onPreviewFrame()

我发现在调用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
Run Code Online (Sandbox Code Playgroud)

我希望有所帮助!


M R*_*hfi 3

您应该在 PreviewCallBacks() 接口的新实例中调用它,如下所示

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