Obtenir une image d’aperçuGet a preview frame

Cette rubrique vous montre comment obtenir une image d’aperçu à partir du flux d’aperçu de capture multimédia.This topic shows you how to get a single preview frame from the media capture preview stream.

Notes

Cet article repose sur les concepts et le code décrits dans Capture photo, vidéo et audio de base à l’aide de MediaCapture, qui décrit comment implémenter la capture photo et vidéo de base.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. Nous vous recommandons de vous familiariser avec le modèle de capture simple de contenu multimédia de cet article avant d’adopter des scénarios de capture plus avancés.We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. Le code de cet article part du principe que votre application possède déjà une instance de MediaCapture correctement lancée et que vous disposez d’un CaptureElement avec un flux d’aperçu vidéo actif.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.

Outre les espaces de noms nécessaires pour la capture multimédia de base, la capture d’une image d’aperçu nécessite les espaces de noms suivants.In addition to the namespaces required for basic media capture, capturing a preview frame requires the following namespace.

using Windows.Media;

Lorsque vous demandez une image d’aperçu, vous pouvez spécifier le format dans lequel vous souhaitez recevoir la trame en créant un objet VideoFrame avec le format de votre choix.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. Cet exemple crée une image vidéo avec la même résolution que celle du flux d’aperçu en appelant VideoDeviceController.GetMediaStreamProperties et en spécifiantMediaStreamType.VideoPreview pour demander les propriétés du flux d’aperçu.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. La largeur et la hauteur du flux d’aperçu sont utilisées pour créer l’image vidéo.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);

Si votre objet MediaCapture est initialisé et que vous avez un flux d’aperçu actif, appelez GetPreviewFrameAsync pour obtenir un flux d’aperçu.If your MediaCapture object is initialized and you have an active preview stream, call GetPreviewFrameAsync to get a preview stream. Passez l’image vidéo créée à la dernière étape pour spécifier le format de l’image renvoyée.Pass in the video frame created in the last step to specify the format of the returned frame.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

Obtenez une représentation SoftwareBitmap de l’image d’aperçu en accédant à la propriété SoftwareBitmap de l’objet VideoFrame.Get a SoftwareBitmap representation of the preview frame by accessing the SoftwareBitmap property of the VideoFrame object. Pour plus d’informations sur l’enregistrement, le chargement et la modification des images bitmap logicielles, voir Acquisition d’images.For information about saving, loading, and modifying software bitmaps, see Imaging.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Vous pouvez également obtenir une représentation IDirect3DSurface de l’image d’aperçu si vous souhaitez utiliser l’image avec les 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;

Important

La propriété SoftwareBitmap ou la propriété Direct3DSurface de l’objet VideoFrame renvoyé peut être null selon la manière dont vous appelez GetPreviewFrameAsync et en fonction de l’appareil sur lequel votre application est exécutée.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.

  • Si vous appelez la surcharge de GetPreviewFrameAsync qui accepte un argument VideoFrame, l’objet VideoFrame renvoyé a une valeur SoftwareBitmap non null et la propriété Direct3DSurface est null.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.
  • Si vous appelez la surcharge de GetPreviewFrameAsync qui n’a aucun argument sur un appareil utilisant une surface Direct3D pour représenter l’image en interne, la propriété Direct3DSurface est non null et la propriété SoftwareBitmap est null.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.
  • Si vous appelez la surcharge de GetPreviewFrameAsync qui n’a aucun argument sur un appareil n’utilisant pas une surface Direct3D pour représenter l’image en interne, la propriété SoftwareBitmap sera non null et la propriété Direct3DSurface sera null.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.

Votre application doit toujours rechercher une valeur null avant d’essayer d’agir sur des objets renvoyés par les propriétés SoftwareBitmap ou Direct3DSurface.Your app should always check for a null value before trying to operate on the objects returned by the SoftwareBitmap or Direct3DSurface properties.

Lorsque vous avez fini d’utiliser l’image d’aperçu, veillez à appeler sa méthode Close (projetée vers Dispose en C#) pour libérer les ressources utilisées par l’image.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. Vous pouvez aussi utiliser le modèle using qui supprime automatiquement l’objet.Or, use the using pattern, which automatically disposes of the object.

previewFrame.Dispose();
previewFrame = null;