Android Camera2 getPreviewFrame

标签 android android-camera android-5.0-lollipop

我正在尝试让相机帧处于预览模式。我正在从 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 列为输出目标。

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

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

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

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

关于Android Camera2 getPreviewFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30195940/

相关文章:

java - 使用Android相机检测条形码

android-5.0-lollipop - BackupManagerService恢复超时导致强制停止

java - Android 布局两个 ImageView 之间的 ScrollView

Android - 从方形位图中切出一个圆圈

包含 'hole' 的 Android View

android - 选择前置摄像头

android - 前 Lollipop 设备上的奇怪自定义工具栏

android-5.0-lollipop - 如何通过为 Lollipop 提供的 API 随机访问 SD 卡上的文件?

android - 如何在Kotlin中将list <String>转换为带有前缀和后缀的字符串

android - 我需要使用我们自己的图像而不是 Canvas 的 android 粒子动画