Abrufen eines Vorschauframes
In diesem Thema erfahren Sie, wie Sie einen einzelnen Vorschauframe aus dem Vorschaudatenstrom der Medienaufnahme abrufen.
Hinweis
Dieser Artikel baut auf Konzepten und Code auf, die unter Allgemeine Foto-, Video- und Audioaufnahme mit „MediaCapture“ erläutert werden. Dort werden die Schritte für die Implementierung einer grundlegenden Foto- und Videoaufnahme beschrieben. Wir empfehlen Ihnen, sich mit dem grundlegenden Medienaufnahmemuster in diesem Artikel vertraut zu machen, bevor Sie sich komplexeren Aufnahmeszenarien zuwenden. Der Code in diesem Artikel geht davon aus, dass Ihre App bereits über eine Instanz von MediaCapture verfügt, die ordnungsgemäß initialisiert wurde, und dass Sie ein CaptureElement mit einem aktiven Videovorschaustream haben.
Zusätzlich zu den Namespaces, die für die grundlegende Medienaufnahme erforderlich sind, erfordert das Erfassen eines Vorschauframes den folgenden Namespace.
using Windows.Media;
Wenn Sie einen Vorschauframe anfordern, können Sie das Format angeben, in dem Sie den Frame erhalten möchten, indem Sie ein VideoFrame-Objekt mit dem gewünschten Format erstellen. In diesem Beispiel wird ein Videoframe erstellt, der die gleiche Auflösung wie der Vorschaudatenstrom aufweist, indem VideoDeviceController.GetMediaStreamProperties aufgerufen und MediaStreamType.VideoPreview angegeben wird, um die Eigenschaften für den Vorschaudatenstrom anzufordern. Die Breite und Höhe des Vorschaudatenstroms wird verwendet, um den neuen Videoframe zu erstellen.
// 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);
Wenn Ihr MediaCapture-Objekt initialisiert ist und Sie über einen aktiven Vorschaudatenstrom verfügen, rufen Sie GetPreviewFrameAsync auf, um einen Vorschaudatenstrom abzurufen. Übergeben Sie den im letzten Schritt erstellten Videoframe, um das Format des zurückgegebenen Frames anzugeben.
VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);
Rufen Sie eine SoftwareBitmap-Darstellung des Vorschauframes ab, indem Sie auf die SoftwareBitmap-Eigenschaft des VideoFrame-Objekts zugreifen. Informationen zum Speichern, Laden und Ändern von Softwarebitmaps finden Sie unter "Imaging".
SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;
Sie können auch eine IDirect3DSurface-Darstellung des Vorschauframes abrufen, wenn Sie das Bild mit Direct3D-APIs verwenden möchten.
var previewSurface = previewFrame.Direct3DSurface;
Wichtig
Entweder die SoftwareBitmap-Eigenschaft oder die Direct3DSurface-Eigenschaft des zurückgegebenen VideoFrames kann null sein, je nachdem, wie Sie GetPreviewFrameAsync aufrufen, und je nach Gerät, auf dem Ihre App ausgeführt wird.
- Wenn Sie die Überladung von GetPreviewFrameAsync aufrufen, die ein VideoFrame-Argument akzeptiert, weist der zurückgegebene VideoFrame eine Nicht-Null-SoftwareBitmap auf, und die Direct3DSurface-Eigenschaft ist NULL.
- Wenn Sie die Überladung von GetPreviewFrameAsync aufrufen, die keine Argumente auf einem Gerät enthält, das eine Direct3D-Oberfläche verwendet, um den Frame intern darzustellen, ist die Direct3DSurface-Eigenschaft ungleich NULL, und die SoftwareBitmap-Eigenschaft ist NULL.
- Wenn Sie die Überladung von GetPreviewFrameAsync aufrufen, die keine Argumente auf einem Gerät hat, das keine Direct3D-Oberfläche verwendet, um den Frame intern darzustellen, ist die SoftwareBitmap-Eigenschaft ungleich NULL, und die Direct3DSurface-Eigenschaft ist NULL.
Ihre App sollte immer nach einem NULL-Wert suchen, bevor Sie versuchen, die von den SoftwareBitmap - oder Direct3DSurface-Eigenschaften zurückgegebenen Objekte zu verwenden.
Wenn Sie mit der Verwendung des Vorschauframes fertig sind, rufen Sie unbedingt die Close-Methode (projiziert auf Dispose in C#) auf, um die vom Frame verwendeten Ressourcen freizugeben. Oder verwenden Sie das verwendungsmuster , das das Objekt automatisch entsorgt.
previewFrame.Dispose();
previewFrame = null;
Zugehörige Themen