我们如何使用 CameraX 获取预览帧?

How do we get the preview frame using CameraX?

我正在开发一个项目,该项目使用 CameraX 在 TextureView 上显示相机预览。代码来自这个 codelab。我使用 setOnPreviewOutputUpdateListener() 方法更新 TextureView.

private fun startCamera() {
    val previewConfig = PreviewConfig.Builder().apply {
        setTargetAspectRatio( Rational( 1 , 1 ) )
        setTargetResolution( Size( 640 , 640 ) )
    }.build()
    val preview = Preview( previewConfig )
    preview.setOnPreviewOutputUpdateListener {
        val parent = cameraTextureView?.parent as ViewGroup
        parent.removeView( cameraTextureView )
        cameraTextureView?.surfaceTexture = it.surfaceTexture
        parent.addView( cameraTextureView , 0)
        updateTransform()
    }
    preview.removePreviewOutputListener()
    CameraX.bindToLifecycle( this , preview )
}

我的问题是如何使用 CameraX 从预览帧中获取原始 byte[] 对象。我期待类似于 onPreviewFrame(byte[] data, Camera camera) 方法的东西。

Basically, I want the realtime frames ( in byte[] or Bitmap ) from the preview using CameraX.

您将使用 ImageAnalysis。预览帧将以 YUV_420_888 格式传递给您的分析器。

如有需要,可以申请非阻塞分析模式。我建议为您的分析器设置一个处理程序,这样相机回调就不会到达 UI 线程。