Получение кадра предварительного просмотраGet a preview frame

В этом разделе объясняется, как получить один кадр предварительного просмотра из потока предварительного просмотра захвата мультимедийного содержимого.This topic shows you how to get a single preview frame from the media capture preview stream.

Примечание

В этой статье используются понятия и код из статьи Основные принципы фото-, аудио- и видеозахвата с помощью MediaCapture, в которой описаны этапы реализации основных принципов фото- и видеозахвата.This article builds on concepts and code discussed in Basic photo, video, and audio capture with MediaCapture, which describes the steps for implementing basic photo and video capture. Мы рекомендуем ознакомиться с базовым шаблоном захвата мультимедиа в этой статье, прежде чем перейти к более сложным сценариям захвата.We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. Код в этой статье рассчитан на то, что ваше приложение уже содержит экземпляр MediaCapture, который был инициализирован надлежащим образом, и что у вас есть объект CaptureElement с активным видеопотоком предварительного просмотра.The code in this article assumes that your app already has an instance of MediaCapture that has been properly initialized, and that you have a CaptureElement with an active video preview stream.

Помимо пространства имен, необходимого для основного захвата мультимедиа, для захвата кадра предварительного просмотра требуется следующее пространство имен.In addition to the namespaces required for basic media capture, capturing a preview frame requires the following namespace.

using Windows.Media;

При запросе кадра предварительного просмотра вы можете указать формат, в котором требуется получить кадр. Для этого создайте объект VideoFrame в соответствующем формате.When you request a preview frame, you can specify the format in which you would like to receive the frame by creating a VideoFrame object with the format you desire. В этом примере будет создан видеокадр с тем же разрешением, что и у потока предварительного просмотра. В ходе него вызывается метод VideoDeviceController.GetMediaStreamProperties и указывается тип MediaStreamType.VideoPreview для запроса свойств для потока предварительного просмотра.This example creates a video frame that is the same resolution as the preview stream by calling VideoDeviceController.GetMediaStreamProperties and specifying MediaStreamType.VideoPreview to request the properties for the preview stream. Ширина и высота потока предварительного просмотра используются для создания видеокадра.The width and height of the preview stream is used to create the new video frame.

// 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, чтобы получить доступ к потоку предварительного просмотра.If your MediaCapture object is initialized and you have an active preview stream, call GetPreviewFrameAsync to get a preview stream. В качестве параметров задайте видеокадр, созданный на последнем шаге, чтобы указать формат возвращенного кадра.Pass in the video frame created in the last step to specify the format of the returned frame.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

Получите кадр предварительного просмотра в представлении SoftwareBitmap, обратившись к свойству SoftwareBitmap объекта VideoFrame.Get a SoftwareBitmap representation of the preview frame by accessing the SoftwareBitmap property of the VideoFrame object. Сведения о сохранении, загрузке и изменении точечных рисунков программного обеспечения см. в разделе Обработка изображений.For information about saving, loading, and modifying software bitmaps, see Imaging.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Вы также можете получить доступ к кадру предварительного просмотра в представлении IDirect3DSurface, чтобы использовать изображение с API Direct3D.You can also get a IDirect3DSurface representation of the preview frame if you want to use the image with Direct3D APIs.

var previewSurface = previewFrame.Direct3DSurface;

Важно!

Свойство SoftwareBitmap или свойство Direct3DSurface возвращенного объекта VideoFrame может иметь нулевое значение в зависимости от того, как был вызван метод GetPreviewFrameAsync, а также в зависимости от устройства, на котором выполняется приложение.Either the SoftwareBitmap property or the Direct3DSurface property of the returned VideoFrame may be null depending on how you call GetPreviewFrameAsync and also depending on the device on which your app is running.

  • Если вызвать перегрузку метода GetPreviewFrameAsync, которая принимает аргумент VideoFrame, то возвращенный объект VideoFrame будет иметь значение SoftwareBitmap, отличное от нулевого, а свойство Direct3DSurface будет иметь нулевое значение.If you call the overload of GetPreviewFrameAsync that accepts a VideoFrame argument, the returned VideoFrame will have a non-null SoftwareBitmap and the Direct3DSurface property will be null.
  • Если вызвать перегрузку GetPreviewFrameAsync, которое не располагает аргументами на устройстве, использующем поверхность Direct3D для представления кадра внутри себя, свойство Direct3DSurface будет иметь значение, отличное от нулевого, а свойство SoftwareBitmap будет иметь нулевое значение.If you call the overload of GetPreviewFrameAsync that has no arguments on a device that uses a Direct3D surface to represent the frame internally, the Direct3DSurface property will be non-null and the SoftwareBitmap property will be null.
  • Если вызвать перегрузку GetPreviewFrameAsync, которое не располагает аргументами на устройстве, не использующем поверхность Direct3D для представления кадра внутри себя, свойство SoftwareBitmap будет иметь значение, отличное от нулевого, а свойство Direct3DSurface будет иметь нулевое значение.If you call the overload of GetPreviewFrameAsync that has no arguments on a device that does not use a Direct3D surface to represent the frame internally, the SoftwareBitmap property will be non-null and the Direct3DSurface property will be null.

Ваше приложение должно всегда проверять нулевое значение перед попыткой работы с объектами, возвращенными свойством SoftwareBitmap или Direct3DSurface.Your app should always check for a null value before trying to operate on the objects returned by the SoftwareBitmap or Direct3DSurface properties.

Поработав с кадром предварительного просмотра, не забудьте вызвать его метод Close (сопоставляемый с Dispose в C#), чтобы освободить ресурсы, используемые кадром.When you are done using the preview frame, be sure to call its Close method (projected to Dispose in C#) to free the resources used by the frame. Можно также использовать шаблон using, который автоматически ликвидирует объект.Or, use the using pattern, which automatically disposes of the object.

previewFrame.Dispose();
previewFrame = null;