Partilhar via


Misturadores Personalizados

[O componente descrito nesta página, Enhanced Video Renderer, é um recurso herdado. Ele foi substituído pelo Simple Video Renderer (SVR) exposto através do MediaPlayer e IMFMediaEngine componentes. 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 componentes foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda enfaticamente que o novo código use MediaPlayer ou o nível inferior IMFMediaEngine APIs 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.]

Este tópico descreve como escrever um misturador personalizado para o renderizador de vídeo aprimorado (EVR). Você pode usar um misturador personalizado com o coletor de mídia Media Foundation EVR ou o filtro DirectShow EVR. Para obter mais informações sobre mixers e apresentadores, consulte Enhanced Video Renderer.

O misturador é uma transformação 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::P rocessInput no misturador, e o apresentador é responsável por chamar IMFTransform::P rocessOutput.

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

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

 

Opcionalmente, uma 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 para o 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 misturador funciona da seguinte forma:

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

  2. O EVR chama IMFVideoPresenter::P rocessMessage 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 mudar, os outros tipos de mídia do mixer não serão mais válidos. O método de IMFTransform::P rocessOutput do misturador falhará e retornará MF_E_TRANSFORM_STREAM_CHANGE. O apresentador não deve fazer nada neste momento. O EVR iniciará novamente o processo de negociação do formato.

Quando qualquer fluxo de entrada atinge o final do fluxo, o EVR chama IMFTransform::P rocessMessage no misturador com MFT_MESSAGE_NOTIFY_END_OF_STREAM.

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

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

 

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

Implementando IMFVideoDeviceID

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

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

Implementando IMFTopologyServiceLookupClient

O misturador deve implementar o IMFTopologyServiceLookupClient interface. Antes do streaming começar, o EVR chama IMFTopologyServiceLookupClient::InitServicePointers e passa um ponteiro para a interface deIMFTopologyServiceLookup do EVR. O misturador usa este ponteiro para obter ponteiros de interface do EVR.

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

Quando o EVR chama IMFTopologyServiceLookupClient::ReleaseServicePointers, o misturador deve liberar quaisquer ponteiros obtidos da chamada para InitServicePointers.

Atributos do misturador

Um misturador deve suportar os seguintes atributos.

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

 

Ajuste do misturador no EVR

Para definir um misturador personalizado no EVR, chame IMFVideoRenderer::InitializeRenderer. Tanto o filtro EVR do DirectShow quanto 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 misturador 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 misturador. O objeto de ativação deve implementar o IMFActivate interface.
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID CLSID do misturador.

 

Renderizador de vídeo aprimorado