Camera2 API - 为什么同一个表面需要指定两次?
Camera2 API - Why the same surface needs to be specified twice?
查看 Camera2 API,表面似乎需要指定两次。在 createCaptureSession
期间完成后,传入表面列表。稍后,我们再次将同一表面指定给预览构建器的 addTarget
方法。如果我们稍后要指定目标表面,为什么我们需要在 createCaptureSession
调用期间最初指定表面列表? addTarget
真正对 createCaptureSession
没有做的表面做了什么?问候。
对于捕获会话,您需要列出可能要用于您的请求的所有表面。这允许相机设备配置其硬件处理管道,以便能够以请求的大小和请求的目的地(例如 1080p 预览到 SurfaceView/TextureView、全分辨率 JPEG 到 ImageReader、4K 视频录制)提供所有这些输出缓冲区到 MediaRecorder,等等)
然后每个请求都包含这些表面的一个子集(或全部)。并非每个请求通常都希望包含每个已配置的 Surface;您通常只包括用于快照的全分辨率 JPEG ImageReader Surface,并且仅在主动录制视频时包括 MediaRecorder Surface。
如果 Surface 仅包含在捕获请求中,则当相机管道看到以前未使用过的新 Surface 时,它必须即时重新配置自身。这通常会导致 300-600 毫秒的暂停,因为相机硬件会刷新其数据并重新配置自身。
因此,为了确保顺利运行,camera2 API 要求应用程序预先指定当前会话所需的所有输出。
查看 Camera2 API,表面似乎需要指定两次。在 createCaptureSession
期间完成后,传入表面列表。稍后,我们再次将同一表面指定给预览构建器的 addTarget
方法。如果我们稍后要指定目标表面,为什么我们需要在 createCaptureSession
调用期间最初指定表面列表? addTarget
真正对 createCaptureSession
没有做的表面做了什么?问候。
对于捕获会话,您需要列出可能要用于您的请求的所有表面。这允许相机设备配置其硬件处理管道,以便能够以请求的大小和请求的目的地(例如 1080p 预览到 SurfaceView/TextureView、全分辨率 JPEG 到 ImageReader、4K 视频录制)提供所有这些输出缓冲区到 MediaRecorder,等等)
然后每个请求都包含这些表面的一个子集(或全部)。并非每个请求通常都希望包含每个已配置的 Surface;您通常只包括用于快照的全分辨率 JPEG ImageReader Surface,并且仅在主动录制视频时包括 MediaRecorder Surface。
如果 Surface 仅包含在捕获请求中,则当相机管道看到以前未使用过的新 Surface 时,它必须即时重新配置自身。这通常会导致 300-600 毫秒的暂停,因为相机硬件会刷新其数据并重新配置自身。
因此,为了确保顺利运行,camera2 API 要求应用程序预先指定当前会话所需的所有输出。