Obter um quadro de visualização

Este tópico mostra como obter um único quadro de visualização do fluxo de visualização de captura de mídia.

Observação

Este artigo se baseia em conceitos e códigos discutidos em Captura básica de fotos, áudio e vídeo com o MediaCapture, que descreve as etapas para implementar uma captura básica de fotos e vídeos. Recomendamos que você se familiarize com o padrão de captura de mídia básica neste artigo antes de passar para cenários de captura mais avançados. O código neste artigo presume que seu aplicativo já tem uma instância de MediaCapture que foi inicializada corretamente e que você tem um CaptureElement com um fluxo de visualização de vídeo ativo.

Além dos namespaces necessários para captura de mídia básica, a captura de um quadro de visualização exige o namespace a seguir.

using Windows.Media;

Quando solicitar um quadro de visualização, você poderá especificar o formato em que gostaria de receber o quadro criando um objeto VideoFrame com o formato desejado. Este exemplo cria um quadro de vídeo com a mesma resolução do fluxo de visualização chamando VideoDeviceController.GetMediaStreamProperties e especificando MediaStreamType.VideoPreview para solicitar as propriedades do fluxo de visualização. A largura e a altura do fluxo de visualização são usadas para criar o novo quadro 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);

Se seu objeto MediaCapture for inicializado e você tiver um fluxo de visualização ativo, chame GetPreviewFrameAsync para obter um fluxo de visualização. Passe o quadro de vídeo criado na última etapa para especificar o formato do quadro retornado.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

Obtenha uma representação de SoftwareBitmap do quadro de visualização acessando a propriedade SoftwareBitmap do objeto VideoFrame. Para obter informações sobre como salvar, carregar e modificar bitmaps de software, consulte Imagens.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Você também poderá obter uma representação de IDirect3DSurface do quadro de visualização se quiser usar a imagem com APIs do Direct3D.

var previewSurface = previewFrame.Direct3DSurface;

Importante

As propriedades SoftwareBitmap ou Direct3DSurface do VideoFrame retornado podem ser nulas dependendo da forma como você chama GetPreviewFrameAsync e do dispositivo no qual o aplicativo está sendo executado.

  • Se você chamar a sobrecarga de GetPreviewFrameAsync que aceita um argumento VideoFrame, o VideoFrame retornado terá um SoftwareBitmap não nulo e a propriedade Direct3DSurface será nula.
  • Se você chamar a sobrecarga de GetPreviewFrameAsync que não tem argumentos em um dispositivo que usa uma superfície Direct3D para representar o quadro internamente, a propriedade Direct3DSurface será diferente de nula e a propriedade SoftwareBitmap será nula.
  • Se você chamar a sobrecarga de GetPreviewFrameAsync que não tem argumentos em um dispositivo que não usa uma superfície Direct3D para representar o quadro internamente, a propriedade SoftwareBitmap será diferente de nula e a propriedade Direct3DSurface será nula.

Seu aplicativo sempre deverá verificar se há um valor nulo antes de tentar operar nos objetos retornados pelas propriedades SoftwareBitmap ou Direct3DSurface.

Quando terminar de usar o quadro de visualização, certifique-se de chamar seu método Close (projetado para Descarte em C#) para liberar os recursos usados pelo quadro. Ou use o padrão using, que descarta automaticamente o objeto.

previewFrame.Dispose();
previewFrame = null;