【问题标题】:Camera2 API - Why the same surface needs to be specified twice?Camera2 API - 为什么需要指定两次相同的表面?
【发布时间】:2018-06-12 14:15:34
【问题描述】:

查看 Camera2 API,似乎需要指定表面两次。一旦在createCaptureSession 期间完成,传入表面列表。稍后,我们再次为 preview-builder 的 addTarget 方法指定相同的表面。如果我们稍后要指定目标表面,为什么我们需要在createCaptureSession 调用期间最初指定表面列表? addTarget 真正对 createCaptureSession 没有做的表面做了什么?问候。

【问题讨论】:

    标签: android android-camera2


    【解决方案1】:

    对于捕获会话,您需要列出您可能希望用于请求的所有表面。这允许相机设备配置其硬件处理管道,以便能够以请求的大小和请求的目的地提供所有这些输出(例如 SurfaceView/TextureView 的 1080p 预览、ImageReaders 的全分辨率 JPEG、4K 视频录制缓冲区媒体记录器等)

    然后每个请求都包含这些 Surface 的子集(或全部)。并非每个请求通常都希望包含每个配置的 Surface;您通常只包含用于快照的全分辨率 JPEG ImageReader Surface,并且仅在主动录制视频时包含 MediaRecorder Surface。

    如果 Surface 仅包含在捕获请求中,则相机管道在看到以前未使用过的新 Surface 时必须即时重新配置自己。这通常会导致 300-600 毫秒的暂停,因为相机硬件会刷新其数据并重新配置自身。

    因此,为了确保顺利运行,camera2 API 要求应用程序预先指定当前会话所需的所有输出。

    【讨论】:

    • 非常感谢您的完美回答。添加表面但不是一直使用它是否有任何开销?例如,ImageReader 仅在用户请求快照时使用。
    • 如果您的用例需要它,请在会话中使用它。您只能在用户按下快门按钮时创建与 ImageReader 的会话,但这会增加图像捕获的延迟。通常这是不可取的。但是,是的,每个 Surface 都会以某种方式消耗资源 - 打开处理管道的不同位,使用传感器的更大分辨率等。因此,如果根本不使用它们,请不要添加它们。
    猜你喜欢
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多