我正在尝试使相机帧处于预览模式。我正在运行githubhttps://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回调,因为发送到CaptureRequest方法的CameraCaptureSession.setRepeatingRequest()没有将ImageReaderSurface列为输出目标。
当您向相机发送请求时,您可以确定要将每个捕获的数据发送到哪个输出Surfaces(基本上是原始字节缓冲区)。因此,要让“预览帧”触发onImageAvailable()回调,然后发送到onPreviewFrame()方法,只需添加一行:
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
该行可以走,例如,在将SurfaceTextureSurface添加到同一请求生成器的其他类似行之后。
请注意,这将向您的函数发送每个预览帧,以及“捕获”按钮的“输出帧”。您可能希望onImageAvailable()回调中的某些代码进行区分。

08-16 16:02