CameraCaptureSession.Prepare(Surface) 方法

定义

为输出 Surface 预分配所有缓冲区。

[Android.Runtime.Register("prepare", "(Landroid/view/Surface;)V", "GetPrepare_Landroid_view_Surface_Handler", ApiSince=23)]
public abstract void Prepare (Android.Views.Surface surface);
[<Android.Runtime.Register("prepare", "(Landroid/view/Surface;)V", "GetPrepare_Landroid_view_Surface_Handler", ApiSince=23)>]
abstract member Prepare : Android.Views.Surface -> unit

参数

surface
Surface

应为其预分配缓冲区的输出 Surface。 必须是用于创建此会话的输出 Surface 之一。

属性

注解

为输出 Surface 预分配所有缓冲区。

通常情况下,给定输出 Surface 的图像缓冲区是按需分配的,以最大程度地减少启动延迟和内存开销。

但是,在某些情况下,可能需要在面向 Surface 的任何请求实际提交到设备之前分配缓冲区。 大型缓冲区可能需要一些时间来分配,这可能会导致提交请求延迟,直到分配足够的缓冲区以达到稳定状态行为。 此类延迟可能会导致突发时间超过所需时间,或导致预览输出中的跳过或口吃。

prepare() 方法可用于执行此预分配。 它只能在该 Surface 用作请求的目标之前为给定的输出 Surface 调用。 分配的缓冲区数是使用者提供输出 Surface 所需的计数之和,以及相机设备填充其管道所需的最大数量。 由于此数目可能大于稳定状态操作实际所需的数量,因此使用准备可能会导致内存消耗量高于正常的按需行为。 Prepare() 还将延迟首次输出到给定 Surface 的时间,以换取分配完成后的更流畅的帧速率。

例如,创建 android.media.ImageReader#newInstance ImageReader maxImages 参数为 10 的应用程序,但一次只使用 3 个同时的图像通常只会导致分配这 3 个图像(加上相机设备需要的内容)才能顺利运行。 但在 ImageReader Surface 上使用 prepare()将导致分配所有 10 个映像。 因此,使用此方法的应用程序应注意仅请求其应用程序实际所需的缓冲区数。

如果在连续会话(未显式关闭第一个会话的情况下)使用相同的输出 Surface,则其已分配的缓冲区将进行传递,如果将其用作第一个会话中的捕获请求的目标,则无法在第二个会话中对其调用准备。

分配完成后, StateCallback#onSurfacePrepared 将使用提供给此方法的 Surface 调用。 在准备调用和 onSurfacePrepared 调用之间,提供给准备的 Surface 不得用作提交到此会话的 CaptureRequest 的目标。

请注意,如果 2 个图面通过 OutputConfiguration#enableSurfaceSharing OutputConfiguration#addSurface> 共享同一流,则 prepare() 只需在一个图面上调用,并且 StateCallback#onSurfacePrepared 将针对这两个图面触发。

android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY 设备无法预分配输出缓冲区;对于这些设备, StateCallback#onSurfacePrepared 将立即调用,不会进行预分配。

适用于 . 的 android.hardware.camera2.CameraCaptureSession.prepare(android.view.Surface)Java 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

适用于