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:
O EVR define o tipo de mídia no fluxo de referência.
O EVR chama IMFVideoPresenter::P rocessMessage no apresentador com a mensagem MFVP_MESSAGE_INVALIDATEMEDIATYPE.
O apresentador define o tipo de mídia no fluxo de saída do mixer.
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. |
Tópicos relacionados