Camera2:从已创建的 CameraCaptureSession 中删除 Surface

Posted

技术标签:

【中文标题】Camera2:从已创建的 CameraCaptureSession 中删除 Surface【英文标题】:Camera2: Remove Surface from already created CameraCaptureSession 【发布时间】:2020-05-21 01:36:59 【问题描述】:

我正在创建一个应用程序,它可以同时从前置和后置摄像头获取视频。两台相机都将图像发送到各自的ImageReader 进行一些处理。我还有一个TextureView 来显示用户所需相机的任何一个的预览。

所以显示预览的相机的捕获会话有两个表面ImageReaderTextureView,而另一个相机只有ImageReader

现在,当用户切换相机时我想从一个CameraCaptureSession 中删除TextureViewSurface 并添加到另一个会话中

有什么方法可以在不关闭会话的情况下从 CameraCaptureSession 中删除 Surface

我现在的代码(后置摄像头类似):

        SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(mTextureView.getWidth(), mTextureView.getHeight());
        mCaptureRequestBuilderFront = mCameraDeviceFront.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

        List<Surface> surfaces = new ArrayList<Surface>();

        /* Make Surface out of texture as preview is shown on a Surface */
        Surface surface = new Surface(surfaceTexture);
        surfaces.add(surface);
        mCaptureRequestBuilderFront.addTarget(surface);

        /* Make Surface out of ImageReader to get images for processing */
        Surface readerSurface = mImageReaderFront.getSurface();
        surfaces.add(readerSurface);
        mCaptureRequestBuilderFront.addTarget(readerSurface);

        /* Create the Capture Session to start getting images from the camera */
        mCameraDeviceFront.createCaptureSession(
                surfaces
                , mSessionCallbackFront
                , mBackgroundHandler);

【问题讨论】:

我现在正在尝试以下操作:将表面列表的全局范围变量传递给会话,将根据需要删除/添加表面。如果可行,将更新。 【参考方案1】:

不,这是不可能的。您当然可以停止在请求中定位 TextureView,但另一个会话不能在其输出集中包含 TextureView,除非在没有它的情况下重新创建第一个会话。

如果你想让这个更平滑,你基本上需要实现自己的缓冲区路由 - 例如,有一个 GL 阶段,它有两个输入 SurfaceTexture 并渲染到 TextureView SurfaceTexture,然后将每个相机连接到一个 SurfaceTexture .然后,您编写一个像素着色器,将表面纹理 A 或 B 复制到输出中,具体取决于哪个相机处于活动状态。

这是很多样板,但非常有效。

在最近的 android 版本中,您可以尝试使用一对用于相机的 ImageReader 和一个用于 TextureView 的 ImageWriter,使用接受使用标志的 ImageReader constructor 和使用标志 GPU_SAMPLED_IMAGE。然后将图像从您当前处于活动状态的 ImageReader 排队到 ImageWriter 到 TextureView。

【讨论】:

以上是关于Camera2:从已创建的 CameraCaptureSession 中删除 Surface的主要内容,如果未能解决你的问题,请参考以下文章

如何以最有效的方式创建多个 camera2 预览?

Azure上采用Powershell从已有的VHD创建VM

Android原生人脸识别Camera2示例

从已定义的贝塞尔路径创建 UIbutton?

如何从已在其中创建的不同类对象中访问类对象的成员函数?

从已删除的虚拟机中分离磁盘