Compartir a través de


Obtener un fotograma de vista previa

En este tema se muestra cómo obtener un solo fotograma de vista previa de la secuencia de vista previa de captura multimedia.

Nota:

Este artículo se basa en los conceptos y el código analizados en Captura básica de fotos, audio y vídeo con MediaCapture, donde se describen los pasos para implementar la captura básica de fotos y vídeo. Se recomienda que te familiarices con el patrón de captura de multimedia básico de ese artículo antes de pasar a escenarios de captura más avanzados. El código de este artículo supone que la aplicación ya tiene una instancia de MediaCapture que se ha inicializado correctamente y que tiene un objeto CaptureElement con una secuencia de vista previa de vídeo activa.

Además de los espacios de nombres necesarios para la captura básica de medios, la captura de un marco de vista previa requiere el siguiente espacio de nombres.

using Windows.Media;

Al solicitar un marco de vista previa, puede especificar el formato en el que desea recibir el fotograma mediante la creación de un objeto VideoFrame con el formato que desee. En este ejemplo se crea un fotograma de vídeo que es la misma resolución que la secuencia de vista previa llamando a VideoDeviceController.GetMediaStreamProperties y especificando MediaStreamType.VideoPreview para solicitar las propiedades de la secuencia de vista previa. El ancho y el alto de la secuencia de vista previa se usan para crear el nuevo fotograma de vídeo.

// 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 el objeto MediaCapture se inicializa y tiene una secuencia de vista previa activa, llame a GetPreviewFrameAsync para obtener una secuencia de vista previa. Pase el fotograma de vídeo creado en el último paso para especificar el formato del fotograma devuelto.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

Obtenga una representación de SoftwareBitmap del marco de vista previa accediendo a la propiedad SoftwareBitmap del objeto VideoFrame. Para obtener información sobre cómo guardar, cargar y modificar mapas de bits de software, consulte Imaging.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

También puede obtener una representación IDirect3DSurface del marco de vista previa si desea usar la imagen con las API de Direct3D.

var previewSurface = previewFrame.Direct3DSurface;

Importante

La propiedad SoftwareBitmap o la propiedad Direct3DSurface del VideoFrame devuelto puede ser null en función de cómo llames a GetPreviewFrameAsync y también dependiendo del dispositivo en el que se ejecuta la aplicación.

  • Si llamas a la sobrecarga de GetPreviewFrameAsync que acepta un argumento VideoFrame, el VideoFrame devuelto tendrá un softwareBitmap distinto de null y la propiedad Direct3DSurface será null.
  • Si llamas a la sobrecarga de GetPreviewFrameAsync que no tiene argumentos en un dispositivo que usa una superficie direct3D para representar el marco internamente, la propiedad Direct3DSurface será no null y la propiedad SoftwareBitmap será null.
  • Si llamas a la sobrecarga de GetPreviewFrameAsync que no tiene argumentos en un dispositivo que no usa una superficie de Direct3D para representar el marco internamente, la propiedad SoftwareBitmap será no null y la propiedad Direct3DSurface será null.

La aplicación siempre debe comprobar si hay un valor NULL antes de intentar operar en los objetos devueltos por las propiedades SoftwareBitmap o Direct3DSurface .

Cuando haya terminado de usar el marco de vista previa, asegúrese de llamar a su método Close (proyectado a Dispose en C#) para liberar los recursos usados por el marco. O bien, use el patrón using , que elimina automáticamente el objeto .

previewFrame.Dispose();
previewFrame = null;