You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓Camera2已启动的Camera Capture Session如何添加target?

Camera2 动态控制预览输出无卡顿实现方案

不需要每次增删输出target都重建CaptureSession,你遇到的卡顿完全可以通过更合理的实现逻辑规避,目前有两种成熟的落地方案:

方案1:全版本兼容方案(推荐)

  • 初始创建CaptureSession时,就将所有可能用到的输出Surface一次性全部注册:包括预览用的TextureView Surface、MediaCodec编码用的输入Surface,不需要考虑当前是否需要开启预览。
  • 实际运行时通过修改CaptureRequest.Builder.addTarget()的参数,动态控制帧数据的输出目标:
    • 关闭预览:仅将MediaCodec的Surface添加到CaptureRequest的target列表,此时帧数据只会送给编码器,不会输出到TextureView,完全符合不通过显示/隐藏TextureView控制预览开关的要求
    • 开启预览:同时将TextureView Surface和MediaCodec Surface添加到CaptureRequest的target列表
  • 该方案无任何额外底层开销,修改CaptureRequest的操作可以在毫秒级完成,完全不会影响录制流畅度,绝大多数Android设备都支持同时输出2个及以上的Surface,完全覆盖预览+录制的使用场景。

方案2:Android 12+ 专用方案

如果你的应用最低兼容版本到Android 12(API 31),可以直接用系统提供的动态更新输出配置API:

  • 调用CameraCaptureSession.updateOutputConfiguration(OutputConfiguration)即可动态增删Session的输出目标
  • 该API不需要重建整个CaptureSession,仅修改底层管道的输出路由,开销远低于重建Session,基本不会产生可感知的卡顿。

官方文档明确说明创建会话是开销很高的操作,可能需要数百毫秒,因此不要在录制过程中调用CameraDevice.createCaptureSession()重建会话,这是之前出现卡顿的核心原因,该操作会强制重启相机底层管道、重分配缓冲区,必然会导致数百毫秒的帧中断。

内容的提问来源于stack exchange,提问作者Aaron Portal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:48:00