Android Camera2 getPreviewFrame

Android Camera2 getPreviewFrame

我正在尝试在预览模式下获取相机画面。我是 运行 来自 github https://github.com/googlesamples/android-Camera2Basic

的示例项目

我遇到的问题是在预览模式下获取框架。

代码如下:

private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {

    private void process(CaptureResult result) {
        switch (mState) {
            case STATE_PREVIEW: {

                //HERE, HOW CAN I RETRIEVE THE CURRENT FRAME?

                break;
            }
            case STATE_WAITING_LOCK: {
               ...
                break;
            }
            case STATE_WAITING_PRECAPTURE: {
             ...
                break;
            }
            case STATE_WAITING_NON_PRECAPTURE: {
             ...
                break;
            }
        }
    }

我试图获取框架的另一件事是设置 mImageReader.setOnImageAvailableListener。 我期望能够获得帧 onImageAvailable 回调,但从未调用过 onImageAvailable。 onPreviewFrame是我自己的方法,我需要把当前帧传给它。

  mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, /*maxImages*/2);
  mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);

  private final ImageReader.OnImageAvailableListener mOnImageAvailableListener  = new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {
        mTextureView.onPreviewFrame(reader.acquireNextImage().getPlanes([0].getBuffer().array());
    }

};

我做错了什么? 谢谢

当预览帧可用时,永远不会调用 OnImageAvailableListener.onImageAvailable 回调,因为发送到 CameraCaptureSession.setRepeatingRequest() 方法的 CaptureRequest 没有列出 ImageReaderSurface 作为输出目标。

当您向相机发送请求时,您确定希望每次捕获的数据转到哪个输出 Surfaces(本质上是原始字节缓冲区)。因此,要让 "preview frames" 触发 onImageAvailable() 回调然后发送到您的 onPreviewFrame() 方法,只需添加以下行:

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

此行可以在 e.g. 之后,在将 SurfaceTextureSurface 添加到同一请求构建器的其他类似行之后。

请注意,这会将每个预览帧发送到您的函数,以及来自捕获按钮的 "output frames"。您可能需要 onImageAvailable() 回调中的一些代码来区分。