Misturadores personalizados

[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.]

Este artigo descreve como gravar um mixer personalizado para o EVR (renderizador de vídeo avançado). Você pode usar um mixer personalizado com o coletor de mídia EVR do Media Foundation ou o filtro EVR do DirectShow. Para obter mais informações sobre mixers e apresentadores, consulte Renderizador de vídeo avançado.

O mixer é uma transformação do Media Foundation (MFT) com uma ou mais entradas (o fluxo de referência mais os subfluxos) e uma saída. O fluxo de entrada recebe amostras do upstream. O fluxo de saída entrega amostras ao apresentador. O EVR é responsável por chamar IMFTransform::ProcessInput no mixer, e o apresentador é responsável por chamar IMFTransform::ProcessOutput.

No mínimo, um misturador EVR deve implementar as seguintes interfaces:

Interface Descrição
IMFTransform Fornece funcionalidade MFT básica.
IMFTopologyServiceLookupClient Permite que o mixer obtenha interfaces do EVR.
IMFVideoDeviceID Permite que o mixer obtenha interfaces do EVR.
IMFAttributes Usado para expor o atributo MF_SA_D3D_AWARE ao EVR.

 

Opcionalmente, um MFT pode implementar qualquer uma das seguintes interfaces:

Interface Descrição
IEVRTrustedVideoPlugin Necessário para reproduzir conteúdo protegido.
IMFGetService Expõe interfaces como IMFVideoMixerBitmap e IMFVideoProcessor ao aplicativo.
IMFQualityAdvise Permite que o gerente de qualidade ajuste a qualidade do vídeo.
IMFVideoMixerBitmap Permite que o aplicativo misture um bitmap estático no vídeo.
IMFVideoPositionMapper Mapeia coordenadas no quadro de vídeo de saída para coordenadas no quadro de vídeo de entrada.
IMFVideoProcessor Expõe alguns recursos de processamento de vídeo DXVA para o aplicativo.

 

A negociação de formato com o mixer funciona da seguinte forma:

  1. O EVR define o tipo de mídia no fluxo de referência.

  2. O EVR chama IMFVideoPresenter::ProcessMessage no apresentador com a mensagem MFVP_MESSAGE_INVALIDATEMEDIATYPE.

  3. O apresentador define o tipo de mídia no fluxo de saída do mixer.

  4. O EVR define o tipo de mídia nos subfluxos.

Se o tipo de mídia no fluxo de referência for alterado, os outros tipos de mídia do mixer não serão mais válidos. O método IMFTransform::ProcessOutput do mixer falhará e retornará MF_E_TRANSFORM_STREAM_CHANGE. O apresentador não deve fazer nada neste momento. O EVR iniciará o processo de negociação de formato novamente.

Quando qualquer fluxo de entrada atinge o final do fluxo, o EVR chama IMFTransform::ProcessMessage no mixer com MFT_MESSAGE_NOTIFY_END_OF_STREAM.

O mixer envia os seguintes eventos para o EVR, usando a interface IMediaEventSink do EVR. Essa interface está documentada na documentação do SDK do DirectShow.

Evento Descrição
EC_SAMPLE_NEEDED O mixer requer uma nova amostra de entrada.

 

O EVR pode chamar ProcessOutput no mixer antes do início do streaming. O mixer não deve falhar nessas chamadas. Em vez disso, ele deve preencher a superfície de saída com pixels pretos. O mixer deve continuar a preencher amostras de saída de cor até receber uma mensagem MFT_MESSAGE_NOTIFY_BEGIN_STREAMING ou o método ProcessInput ser chamado. Se o mixer receber uma mensagem MFT_MESSAGE_NOTIFY_END_STREAMING, ele deve voltar para o modo de preenchimento de cores.

Implementar IMFVideoDeviceID

A interface IMFVideoDeviceID contém um método, GetDeviceID, que retorna um GUID de dispositivo. O GUID de dispositivo garante que o apresentador e o mixer usem tecnologias compatíveis. Se os GUIDs de dispositivo não corresponderem, o EVR não será inicializado.

O mixer e o apresentador padrão usam Direct3D 9, com o GUID de dispositivo igual a IID_IDirect3DDevice9. Se você pretende usar seu apresentador personalizado com o mixer padrão, o GUID de dispositivo do apresentador deve ser IID_IDirect3DDevice9. Se você substituir os dois componentes, poderá definir um novo GUID de dispositivo.

Implementar IMFTopologyServiceLookupClient

O mixer deve implementar a interface IMFTopologyServiceLookupClient. Antes do início do streaming, o EVR chama IMFTopologyServiceLookupClient::InitServicePointers e passa um ponteiro para a interfaceIMFTopologyServiceLookup do EVR. O mixer usa esse ponteiro para obter ponteiros de interface do EVR.

No mínimo, o mixer deve consultar a seguinte interface:

Quando o EVR chama IMFTopologyServiceLookupClient::ReleaseServicePointers, o mixer deve liberar todos os ponteiros obtidos da chamada para InitServicePointers.

Atributos do mixer

Um mixer deve suportar os seguintes atributos.

Atributo Descrição
MF_SA_D3D_AWARE Especifica se o mixer oferece suporte a DXVA (DirectX Video Acceleration).
MF_SA_REQUIRED_SAMPLE_COUNT O número de amostras de vídeo que o EVR deve alocar para cada fluxo de mixer. Esse atributo se aplica a fluxos individuais; use o repositório de atributos retornado por IMFTransform::GetInputStreamAttributes.

 

Definindo o mixer no EVR

Para definir um mixer personalizado no EVR, chame IMFVideoRenderer::InitializeRenderer. O filtro EVR do DirectShow e o coletor de mídia EVR implementam esse método.

Objeto de ativação EVR. Se você estiver usando o objeto de ativação EVR, poderá fornecer um mixer personalizado definindo um dos seguintes atributos no objeto de ativação EVR:

Atributo Descrição
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE Ponteiro para um objeto de ativação para o mixer. O objeto de ativação deve implementar a interface IMFActivate.
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID CLSID do mixer.

 

Renderizador de Vídeo Avançado