【问题标题】:Camera onPreviewFrame not called未调用相机 onPreviewFrame
【发布时间】:2011-10-25 22:08:51
【问题描述】:

当使用 Camera.PreviewCallback 实现时,在初始化相机并开始预览 (Camera.startPrevew()) 后调用 onPreviewFrame 没有问题。问题是,如果我使用 MediaRecorder 进行视频录制,onPreviewFrame 将不再被调用。

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

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

【问题讨论】:

  • 你找到正常的解决方案了吗?

标签: android video camera


【解决方案1】:

你必须在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());
}
}

【讨论】:

  • 你不能在MediaRecorder.start之后调用mCamera.stopPreview();mCamera.startPreview();,否则当你尝试停止录制MediaRecorder.stop时应用程序不会响应。
  • 无论如何你的回答很奇怪,因为它根本与 SurfaceView 或 TextureView 无关:stackoverflow.com/questions/52314822/…
  • 我们谈论的是onPreviewFrame 回调,而不是某些视图(SurfaceView 或 TextureView)上的视频可视化。
【解决方案2】:

我遇到了类似的问题;见

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

希望对你有帮助!

【讨论】:

  • 这解决了我的问题。我打电话给lock() 而不是reconnect()
  • mCamera.reconnect(); 如果你这样做并尝试启动 MediaRecorder 你会得到异常...
  • 我在MediaRecorder.start 之后也尝试过 - 不起作用
【解决方案3】:

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

【讨论】:

  • 之后 - 你听到自己的声音了吗?问题是如何同时记录和获取帧,而不是之后
【解决方案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) {
                }
            }
        }
}

【讨论】:

  • 没有意义,你没看懂问题,MediaRecorder.start 后不会发送帧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多