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

时间:2018-11-04 12:08:36

标签: android android-camera2

我有一个应用通过使用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的接收器数据?

1 个答案:

答案 0 :(得分:0)

对于不同的输出分辨率,直接使用camera2无法做到这一点。如果需要更改输出的分辨率,则必须使用所需的新输出创建一个新的捕获会话。

如果您希望使用多个相同大小的SurfaceView,则可以使用API​​级别26和更高版本的OutputConfiguration(https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration)中添加的表面共享API。

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