Abrufen eines Vorschauframes

In diesem Thema wird das Abrufen eines einzelnen Vorschauframes aus dem Vorschaustream der Medienaufnahme beschrieben.

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 setzt voraus, dass Ihre App bereits über eine instance von MediaCapture verfügt, die ordnungsgemäß initialisiert wurde, und dass Sie über ein CaptureElement mit einem aktiven Videovorschaustream verfügen.

Neben den Namespaces, die für eine einfache Medienaufzeichnung erforderlich sind, erfordert das Aufzeichnen eines Vorschauframes den folgenden Namespace.

using Windows.Media;

Wenn Sie einen Vorschauframe anfordern, können Sie das Format angeben, in dem Sie den Frame empfangen möchten, indem Sie ein VideoFrame-Objekt im gewünschten Format erstellen. Dieses Beispiel erstellt einen Videoframe mit der gleichen Auflösung wie der Vorschaustream durch Aufrufen von VideoDeviceController.GetMediaStreamProperties und Angeben von MediaStreamType.VideoPreview zum Anfordern der Eigenschaften für den Vorschaustream. Die Breite und Höhe des Vorschaustreams werden zum Erstellen des neuen Videoframes verwendet.

// 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 das MediaCapture-Objekt initialisiert ist, und Sie einen aktiven Vorschaustream besitzen, rufen Sie GetPreviewFrameAsync auf, um einen Vorschauframe abzurufen. Übergeben Sie den Videoframe, den Sie im letzten Schritt erstellt haben, um das Format des zurückgegebenen Frames anzugeben.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

Rufen Sie eine SoftwareBitmap-Darstellung des Vorschauframes durch Zugriff auf die SoftwareBitmap-Eigenschaft des VideoFrame-Objekts ab. 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

Die Eigenschaft SoftwareBitmap oder die Eigenschaft Direct3DSurface des zurückgegebenen VideoFrame ist möglicherweise Null, abhängig davon, wie Sie GetPreviewFrameAsync aufrufen, und von dem Gerät, auf dem Ihre App ausgeführt wird.

  • Wenn Sie die Überladung von GetPreviewFrameAsync aufrufen, die ein VideoFrame-Argument akzeptiert, dann ist für den zurückgegebenen VideoFrame der SoftwareBitmap-Wert nicht Null, und die Eigenschaft Direct3DSurface ist Null.
  • Wenn Sie auf einem Gerät, das eine Direct3D-Oberfläche verwendet, um den Frame intern darzustellen, die Überladung von GetPreviewFrameAsync aufrufen, das keine Argumente besitzt, ist die Eigenschaft Direct3DSurface nicht Null und die Eigenschaft SoftwareBitmap ist Null.
  • Wenn Sie auf einem Gerät, das keine Direct3D-Oberfläche verwendet, um den Frame intern darzustellen, die Überladung von GetPreviewFrameAsync aufrufen, das keine Argumente besitzt, ist die Eigenschaft SoftwareBitmap nicht Null und die Eigenschaft Direct3DSurface ist Null.

Ihre App sollte stets nach einem Null-Wert suchen, bevor versucht wird, Vorgänge für Objekte auszuführen, die von den Eigenschaften SoftwareBitmap oder Direct3DSurface zurückgegeben werden.

Wenn Sie den Vorschauframe nicht mehr benötigen, rufen Sie auf jeden Fall die zugehörige Close-Methode auf (Dispose-Methode in C#), um die vom Frame verwendeten Ressourcen freizugeben. Alternativ können Sie auch das Muster using verwenden, durch das das Objekt automatisch entfernt wird.

previewFrame.Dispose();
previewFrame = null;