获取预览帧

本主题展示如何从媒体捕获预览流获取单个预览帧。

注意

本文以使用 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 属性返回的对象尝试操作之前,应始终检查 null 值。

当你使用该预览帧完成操作时,务必调用其 Close 方法(映射到 C# 中的释放)以释放该帧使用的资源。 或者,使用自动释放对象的 using 模式。

previewFrame.Dispose();
previewFrame = null;