如何在创建 camera2 会话后添加 SurfaceView 的多个表面

How to add multiple surfaces of SurfaceView after camera2 session created

我有一个使用 ImageReader 连续保存相机图像的应用程序。

现在我需要动态添加多个 SurfaceView,以便在创建相机会话后显示不同大小的预览。

因为 ImageReader 的表面是在会话创建之前添加的,如下所示:

mBuilder = mCameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
mBuilder!!.addTarget(mImageReader!!.surface)

val surfaces = ArrayList<Surface>()
surfaces.add(mImageReader!!.surface)
mCameraDevice!!.createCaptureSession(surfaces, mSessionCallback, mBackgroundHandler)

我的新 SurfaceView 将在 createCaptureSession 之后创建。

那么我应该如何为来自 camera2 的接收器数据添加另一个预览表面到设备?

对于不同的输出分辨率,直接使用 camera2 是不可能的。如果您需要更改输出的分辨率,则必须使用您想要的新输出创建一个新的捕获会话。

如果你想要多个相同大小的SurfaceView,可以使用在API level 26及之后的OutputConfiguration(https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration)中添加的surface sharing APIs。

如果这还不够,另一种选择是将相机连接到具有您可能需要的最大 SurfaceView 分辨率的 SurfaceTexture,然后通过 OpenGL 从中渲染较低分辨率的输出,为每个创建 EGL windows您要绘制到的新 SurfaceView。设置 EGL 上下文和呈现需要大量代码,但应该相当高效。