Partilhar via


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;