Como usar os Controles do Mixer 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 enfaticamente que o novo código use o MediaPlayer ou as APIs IMFMediaEngine de nível inferior para reproduzir 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.]

O mixer EVR oferece várias interfaces que um aplicativo pode usar para controlar como o mixer processa o vídeo. Essas interfaces podem ser usadas no DirectShow ou no Media Foundation.

Interface Descrição
Interface IMFVideoMixerBitmap Combinação alfa de uma imagem de bitmap estático ao vídeo.
Interface IMFVideoMixerControl Controla como o EVR mistura subfluxos de vídeo.
Interface IMFVideoProcessor Controla o ajuste de cores, filtros de imagem e outros recursos de processamento de vídeo. Essa interface fornece acesso à funcionalidade implementada pelo driver gráfico, portanto, os recursos exatos dependerão do driver gráfico do usuário.

 

A maneira correta de obter ponteiros para essas interfaces depende se você estiver usando a versão DirectShow do EVR ou a versão do Media Foundation. Para o Media Foundation EVR, também depende se você está usando o EVR diretamente ou através da Sessão de Mídia. (Normalmente, um aplicativo usará o EVR por meio da Sessão de Mídia, não diretamente).

Para obter um ponteiro para qualquer uma dessas interfaces, faça o seguinte:

  1. Obtenha um ponteiro para a interface IMFGetService no EVR.

    • 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 se você não estiver usando a Sessão de Mídia.)

  3. Chame IMFGetService::GetService para obter a interface do mixer. Use o identificador de serviço MR_VIDEO_MIXER_SERVICE.

Combinação alfa de um bitmap no vídeo

Você pode usar a interface IMFVideoMixerBitmap para uma combinação alfa de um bitmap estático ao vídeo durante a reprodução. Você pode armazenar o bitmap em uma superfície Direct3D, especificada como um ponteiro IDirect3DSurface9 ou usar um bitmap GDI.

Se você usar uma superfície Direct3D para o bitmap, a superfície poderá conter dados alfa por pixel, que serão usados quando o mixer alfa combinar a imagem. Como alternativa, você pode definir uma chave de cor, ou seja, uma única cor que será transparente onde quer que apareça no bitmap. Além disso, você pode especificar um valor alfa que será aplicado à imagem inteira. Você também pode definir um retângulo de origem para recortar o bitmap e um retângulo de destino para posicionar o bitmap dentro do quadro de vídeo.

Para definir o bitmap, chame IMFVideoMixerBitmap::SetAlphaBitmap. Esse método usa um ponteiro para uma estrutura de MFVideoAlphaBitmap que especifica o bitmap e os parâmetros de combinação alfa. Para obter código de exemplo, consulte o tópico de referência para o método SetAlphaBitmap.

Depois de definir o bitmap, você pode atualizar os parâmetros de combinação, incluindo os retângulos de origem e destino, chamando IMFVideoMixerBitmap::UpdateAlphaBitmapParameters. A atualização entra em vigor no próximo quadro de vídeo. O vídeo deve estar sendo reproduzido para que a atualização ocorra. Você pode usar esse método para executar animações simples no bitmap. (Se você precisar de efeitos mais sofisticados, considere gravar um mixer EVR personalizado.)

Para limpar o bitmap, chame IMFVideoMixerBitmap::ClearAlphaBitmap.

Como controlar subfluxos

O EVR pode misturar um ou mais subfluxos de vídeo no fluxo de vídeo principal. Para controlar a mistura de subfluxos, use a interface IMFVideoMixerControl.

Configurações do Processador de Vídeo

O mixer EVR usa DirectX Video Acceleration (DXVA) para executar o processamento de vídeo nos fluxos de entrada. Os recursos de processamento exatos dependem do driver de gráficos. Os recursos de processamento de vídeo são descritos usando a estrutura DXVA2_VideoProcessorCaps. Um conjunto específico de recursos é chamado de modo de processamento de vídeo, sendo cada modo identificado por um GUID. Para obter uma lista de GUIDs predefinidos, consulte IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. O driver pode definir GUIDs adicionais específicos do fornecedor, representando diferentes combinações de recursos.

Para localizar os modos com suporte e os recursos de cada modo, faça o seguinte:

  1. Chame IMFGetService::GetService para obter um ponteiro para a interfaceIMFVideoProcessor do mixer.

  2. Chame IMFVideoProcessor::GetAvailableVideoProcessorModes. Esse método retorna uma matriz de GUIDs, que identifica os modos de processador de vídeo disponíveis. A lista é retornada em ordem decrescente de qualidade, o modo com a maior qualidade aparece em primeiro lugar na lista. A lista pode mudar dependendo do formato do vídeo.

  3. Para cada GUID na lista, chame IMFVideoProcessor::GetVideoProcessorCaps para localizar os recursos do modo de processador de vídeo correspondente. O método preenche uma estrutura DXVA2_VideoProcessorCaps com uma descrição dos recursos.

  4. Para selecionar um modo, chame IMFVideoProcessor::SetVideoProcessorMode. Caso contrário, o EVR seleciona automaticamente um modo quando o streaming começa. Nesse caso, você pode chamar IMFVideoProcessor::GetVideoProcessorMode para localizar qual modo foi selecionado.

A maioria dos campos na estrutura DXVA2_VideoProcessorCaps descreve o comportamento do driver de baixo nível e não é de interesse em um aplicativo típico. É mais provável que os seguintes campos sejam de interesse:

  • DeviceCaps. Este campo indica se o processamento de vídeo é executado em hardware ou software e se o driver gráfico é um driver DXVA 1.0 mais antigo.

  • DeinterlaceTechnology. Este campo fornece alguma indicação do nível de qualidade de desentrelaçamento que você pode esperar se o vídeo de origem estiver entrelaçado.

  • ProcAmpControlCaps. Este campo especifica quais controles de ajuste de cor estão disponíveis. Para obter uma lista de possíveis ajustes de cor, consulte Configurações do ProcAmp. Se o driver não puder executar o ajuste de cor, esse campo será zero.

  • VideoProcessorOperations. Este campo contém sinalizadores que descrevem diversos recursos de processamento de vídeo. Dois sinalizadores muito importantes são DXVA2_VideoProcess_SubStreams e DXVA2_VideoProcess_SubStreams. Pelo menos um desses sinalizadores deve estar presente para que o EVR misture subfluxos no fluxo de vídeo de referência. Se nenhum sinalizador estiver presente, o EVR será limitado a um fluxo de vídeo.

  • NoiseFilterTechnology. Este campo indica quais filtros de ruído são compatíveis com o driver de gráficos. Se o driver não oferecer suporte à filtragem de ruído, o valor será DXVA2_NoiseFilterTech_Unsupported.

  • DetailFilterTechnology. Este campo indica quais filtros de ruído são compatíveis com o driver de gráficos. Se o driver não oferecer suporte à filtragem de ruído, o valor será DXVA2_NoiseFilterTech_Unsupported.

Ajuste de cor e filtragem de imagem

O driver gráfico pode ser compatível com ajuste de cor (também chamado de amplificação de processo ou simplesmente ProcAmp) e filtragem de imagem. Quando realizado pela GPU, o ajuste de cor e a filtragem de imagem podem ser feitos em tempo real sem sobrecarga de CPU.

Para usar esses recursos, execute as seguintes etapas:

  1. Selecione um modo de processamento de vídeo conforme descrito na seção anterior.

  2. Chame IMFVideoProcessor::GetVideoProcessorCaps para localizar os recursos de processamento de vídeo conforme descrito na seção anterior. O método preenche uma estrutura DXVA2_VideoProcessorCaps que descreve os recursos, incluindo se o driver oferece suporte a ajuste de cor e filtro de imagem.

  3. Para cada ajuste de cor suportado pelo driver, chame IMFVideoProcessor::GetProcAmpRange para localizar o intervalo de valor possível para essa configuração. Esse método também retorna o valor padrão para a configuração. Chame IMFVideoProcessor::GetProcAmpValues para localizar o valor atual das configurações. Os valores não têm unidades especificadas. O driver deve definir o intervalo de valores.

  4. Chame IMFVideoProcessor::SetFilteringValue para definir um valor de ajuste de cor.

  5. Se o driver oferecer suporte à filtragem de imagens, cada tipo de filtro (ruído e detalhes) oferece suporte a três configurações — nível, raio e limite — no chroma e no luma. (Consulte Configurações de Filtro de Imagem DXVA.) Para cada configuração, chame IMFVideoProcessor::GetFilteringRange para obter o intervalo de valores possíveis e chame IMFVideoProcessor::GetFilteringValue para obter o valor atual.

  6. Para alterar uma configuração do filtro de imagem, chame IMFVideoProcessor::SetFilteringValue.

Renderizador de Vídeo Avançado