共用方式為


取得預覽畫面

本主題示範如何從媒體擷取預覽串流中取得單一預覽畫面。

注意

本文以使用 MediaCapture 進行基本相片、視訊和音訊的擷取中所討論的概念和程式碼為基礎,說明實作基本相片和視訊擷取的步驟。 我們建議您先熟悉該文章中的基本媒體擷取模式後,再繼續進行更進階的擷取案例。 本文中的程式碼假設您的應用程式已具有已正確初始化的 MediaCapture 執行個體,並且您有一個使用中視訊預覽串流的 CaptureElement

除了基本媒體擷取所需的命名空間之外,擷取預覽畫面還需要下列命名空間。

using Windows.Media;

當您要求預覽畫面時,您可以指定您想要接收畫面的格式,方法是使用您想要的格式建立 VideoFrame 物件。 此範例透過呼叫 VideoDeviceController.GetMediaStreamProperties 並指定 MediaStreamType.VideoPreview 來要求預覽串流的屬性,建立與預覽串流具有相同解析度的視訊畫面。 預覽串流的寬度和高度是用來建立新的視訊畫面。

// Get information about the preview
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;

// Create a video frame in the desired format for the preview frame
VideoFrame videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);

如果 MediaCapture 物件已初始化且您有使用中預覽串流,請呼叫 GetPreviewFrameAsync 以取得預覽串流。 傳入最後一個步驟中建立的視訊畫面,以指定傳回畫面的格式。

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

透過存取 VideoFrame 物件的 SoftwareBitmap 屬性來取得預覽畫面的 SoftwareBitmap 表示法。 如需儲存、載入及修改軟體點陣圖的相關資訊,請參閱映像處理

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

如果您想透過 Direct3D API 使用影像,也可以獲得預覽畫面的 IDirect3DSurface 表示法。

var previewSurface = previewFrame.Direct3DSurface;

重要

傳回的 VideoFrameSoftwareBitmap 屬性或 Direct3DSurface 屬性可能為 null,取決於您呼叫 GetPreviewFrameAsync 的方式以及執行應用程式的裝置。

  • 如果呼叫接受 VideoFrame 引數的 GetPreviewFrameAsync 多載,則傳回的 VideoFrame 將具有非 null SoftwareBitmap,且 Direct3DSurface 屬性將為 null。
  • 如果在使用 Direct3D 表面在內部表示畫面的裝置上呼叫不含引數的 GetPreviewFrameAsync 多載,則 Direct3DSurface屬性將為非 null,且 SoftwareBitmap 屬性將為 null。
  • 如果在不使用 Direct3D 表面在內部表示畫面的裝置上呼叫不含引數的 GetPreviewFrameAsync 多載,則 SoftwareBitmap屬性將為非 null,而 Direct3DSurface 屬性將為 null。

在嘗試對 SoftwareBitmapDirect3DSurface 屬性傳回的物件進行操作之前,應用程式應始終檢查空值。

使用預覽畫面後,請務必呼叫其 Close 方法 (在 C# 中投影為 Dispose) 以釋放該畫面使用的資源。 或者,使用 using 模式,以自動處置物件。

previewFrame.Dispose();
previewFrame = null;