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:
O EVR define o tipo de mídia no fluxo de referência.
O EVR chama IMFVideoPresenter::ProcessMessage 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 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. |
Tópicos relacionados