Usar os controles de exibição de vídeo

O componente descrito nesta página, Renderizador de vídeo avançado, é um recurso herdado. Ele foi substituído pelo SVR (Simple Video Renderer) exposto através dos componentes MediaPlayer e IMFMediaEngine. Para reproduzir conteúdo de vídeo, você deve enviar dados para um desses componentes e permitir que eles instanciem o novo renderizador de vídeo. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o MediaPlayer ou as APIs do IMFMediaEngine de nível inferior para reproduzir uma mídia de vídeo no Windows em vez do EVR, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

A interface IMFVideoDisplayControl controla como o renderizador de vídeo avançado (EVR) exibe vídeo dentro de uma janela do aplicativo. Essa interface pode ser usada no DirectShow ou no Media Foundation. Internamente, os controles de exibição de vídeo são fornecidos pelo apresentador padrão do EVR. Se você gravar um apresentador personalizado, poderá fornecer a mesma interface ou definir uma interface personalizada.

A maneira correta de obter um ponteiro para a interface IMFVideoDisplayControl depende se você está usando a versão do DirectShow do EVR ou a versão do Media Foundation. Para o EVR do Media Foundation, também depende se você está usando o EVR diretamente ou através da Sessão de Mídia (que é mais típico).

Para obter um ponteiro para a interface IMFVideoDisplayControl, faça o seguinte:

  1. Obtenha um ponteiro para a interface IMFGetService.

    • Se você estiver usando o filtro EVR do DirectShow, chame QueryInterface no filtro.

    • Se você estiver usando o coletor de mídia EVR diretamente, chame QueryInterface no coletor de mídia.

    • Se você estiver usando a sessão de mídia, chame QueryInterface na Sessão de Mídia.

  2. Se você estiver usando a Sessão de Mídia, aguarde até que a Sessão de Mídia envie o evento MESessionTopologyStatus com um valor de status de MF_TOPOSTATUS_READY. (Ignore esta etapa, caso contrário.)

  3. Chame IMFGetService::GetService para obter a interface IMFVideoDisplayControl. Use o identificador de serviço MR_VIDEO_RENDER_SERVICE.

Você pode usar a interface IMFVideoDisplayControl para executar as seguintes tarefas:

  • Defina a janela de recorte.

  • Defina os retângulos de origem e de destino.

  • Atualize a janela de vídeo em resposta às mensagens da janela.

  • Habilitar ou desabilitar o modo de tela inteira.

Janela de recorte

O aplicativo deve fornecer uma janela em que o EVR exibe o vídeo. Para definir a janela de recorte, chame IMFVideoDisplayControl::SetVideoWindow com um identificador para a janela do aplicativo.

Se você criar o coletor de mídia EVR por meio de seu objeto de ativação, essa etapa não será necessária. O objeto de ativação chama automaticamente SetVideoWindow, usando o identificador de janela que você forneceu na função MFCreateVideoRendererActivate.

Retângulos de origem e destino

Durante a reprodução, o apresentador pega uma parte da imagem de vídeo com composição e a exibe em uma área da janela de vídeo. A parte da imagem com composição é o retângulo de origem e a área da janela de vídeo é o retângulo de destino.

O retângulo de origem é definido usando coordenadas normalizadas onde o ponto (0,0, 0,0) corresponde ao canto superior esquerdo do vídeo e (1,0, 1,0) corresponde ao canto inferior direito do vídeo. O retângulo de origem pode ser qualquer região dentro desse retângulo. O retângulo de destino é especificado em pixels, em relação à área do cliente da janela. O retângulo de origem padrão é a imagem inteira e o retângulo de destino padrão é um retângulo vazio.

Para definir os retângulos de origem e destino, chame IMFVideoDisplayControl::SetVideoPosition.

Se você criar o coletor de mídia EVR por meio de seu objeto de ativação, essa etapa não será necessária. O objeto de ativação define automaticamente o retângulo de destino igual a toda a área do cliente da janela. No entanto, você deve chamar SetVideoPosition se quiser alterar o retângulo de origem ou definir um retângulo de destino diferente.

Mensagens de janela

Durante a reprodução, seu aplicativo deve responder a determinadas mensagens de janela, da seguinte maneira:

  • WM_PAINT: Chame IMFVideoDisplayControl::RepaintVideo para repintar o vídeo. Além disso, evite pintar sobre o retângulo de destino durante a reprodução do vídeo, porque isso pode causar cintilação.

  • WM_SIZE: Talvez seja necessário chamar SetVideoPosition para redimensionar o retângulo de destino.

Ao contrário do filtro VMR (Video Mixing Renderer) no DirectShow, você não precisa notificar o EVR quando receber uma mensagem WM_DISPLAYCHANGE.

Renderizador de Vídeo Avançado