語言

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,緩衝區應預先分配。 一定是用來建立這個會話的輸出 Surfaces之一。

屬性

備註

預先分配所有緩衝區以分配輸出 Surface。

通常,特定輸出 Surface 的影像緩衝區會按需分配,以降低啟動延遲與記憶體負擔。

然而,在某些情況下,緩衝區在針對 Surface 的請求實際提交前,可能會更理想。 大型緩衝區可能需要一段時間才能分配,這可能導致請求提交延遲,直到分配足夠緩衝區以達到穩態行為。 這種延遲可能導致突發播放時間比預期更長,或在預覽輸出中出現跳針或卡頓。

可用 prepare() 方法來執行此預配置。 只有在該 Surface 被用作請求目標之前,才能對該 Surface 進行呼叫。 分配的緩衝區數量是消費者提供輸出 Surface 所需的數量與攝影機裝置填滿管線所需的最大數量之和。 由於這可能比穩態運作所需的數量還要多,使用 prepare 可能會導致記憶體消耗比一般隨選行為更高的。 Prepare() 也會延遲首次輸出到特定 Surface 的時間,以換取分配完成後更平滑的幀率。

例如,一個應用程式如果建立 android.media.ImageReader#newInstance ImageReader 一個 maxImages 參數為 10,但同時只使用 3 張影像,通常只會分配這 3 張影像(加上相機裝置為了順暢運作所需的數量)。 但在 ImageReader Surface 使用 prepare() 時,會分配全部 10 張圖片。 因此,使用此方法的應用程式應謹慎只請求其實際需要的緩衝區數量。

若同一輸出 Surface 在連續多個會話中使用(且未明確關閉第一個會話),則其已分配的緩衝區會被帶入;若該緩衝區在第一個會話中作為擷取請求的目標,則無法在第二個會話中呼叫 premere。

一旦分配完成,StateCallback#onSurfacePrepared將使用提供給此方法的 Surface 來調用。 在準備呼叫與 onSurfacePrepared 呼叫之間,準備所提供的 Surface 不得作為提交給此會話的擷取請求的目標。

請注意,如果兩個曲面共用同一串流,OutputConfiguration#enableSurfaceSharingOutputConfiguration#addSurface且 ,prepare() 只需在其中一個曲面呼叫,且StateCallback#onSurfacePrepared會同時觸發兩個曲面。

android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY LEGACY 裝置無法預先分配輸出緩衝區;對於這些裝置, StateCallback#onSurfacePrepared 會立即被呼叫,且不會進行預先配置。

Java 文件 android.hardware.camera2.CameraCaptureSession.prepare(android.view.Surface)。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於