如何在创建 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 上下文和呈现需要大量代码,但应该相当高效。
我有一个使用 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 上下文和呈现需要大量代码,但应该相当高效。