android - Camera2:从已创建的 CameraCaptureSession 中删除 Surface
问题描述
我正在创建一个应用程序,它同时从前置和后置摄像头获取视频。两台相机都将图像发送到各自ImageReader
进行一些处理。我还TextureView
可以显示任何用户想要的相机的预览。
所以显示预览的相机的捕获会话有两个表面ImageReader
,TextureView
而另一个相机只有ImageReader
.
现在,当用户切换相机时,我想从一个中删除TextureView
's并添加到其他会话Surface
CameraCaptureSession
有什么方法可以在不关闭会话的情况下Surface
从 a中删除?CameraCaptureSession
我现在的代码(后置摄像头类似):
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);
解决方案
不,这是不可能的。您当然可以在请求中停止以 TextureView 为目标,但另一个会话不能在其输出集中包含 TextureView,除非在没有它的情况下重新创建第一个会话。
如果你想让这个更平滑,你基本上需要实现自己的缓冲区路由——例如,有一个 GL 阶段,它有两个输入 SurfaceTexture 并渲染到 TextureView SurfaceTexture,然后将每个相机连接到一个 SurfaceTexture。然后,您编写一个像素着色器,将表面纹理 A 或 B 复制到输出中,具体取决于哪个相机处于活动状态。
这是很多样板,但非常有效。
在最近的 Android 版本中,您可以尝试使用一对用于相机的 ImageReader 和一个用于 TextureView 的 ImageWriter,使用接受使用标志的ImageReader 构造函数,以及使用标志GPU_SAMPLED_IMAGE。然后将当前活动的 ImageReader 中的图像排队到 ImageWriter 到 TextureView。
推荐阅读
- r - 如何在 R Shiny 中观察剪贴板中内容的变化?
- python - 通过迭代对数据框的所有行应用函数 - Python
- python - 错误:“ColumnTransformer”对象没有属性“_n_features”
- sql - 按 SUBSTR 分组
- javascript - 将 Sequelize 与 react-native 一起使用时,Metro 错误不支持定义的动态需求
- android - 如何在 Android Studio 中使用 gradle 任务获取依赖项大小?
- angular - Angular 组件似乎与所有实例共享状态
- angular - 即使 ViewChildren 没有发生更改,也会触发 ViewChildren.changes.subscribe
- php - 请求的主题不存在
- javascript - 它是网络语音 API 的错误吗?