Compartir a través de


Mezcladores personalizados

[El componente descrito en esta página, Enhanced Video Renderer es una característica heredada. Se ha reemplazado por Simple Video Renderer (SVR) que se expone mediante los componentes MediaPlayer y IMFMediaEngine. Para reproducir contenido de vídeo, debe enviar datos a uno de estos componentes y permitirles crear instancias del nuevo representador de vídeo. Estos componentes se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer o las API de IMFMediaEngine de nivel inferior para reproducir elementos multimedia de vídeo en Windows en lugar de EVR siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible].

En este tema se describe cómo escribir un mezclador personalizado para el representador de vídeo mejorado (EVR). Puede usar un mezclador personalizado con el receptor de medios EVR de Media Foundation o el filtro DirectShow EVR. Para obtener más información sobre los mezcladores y moderadores, vea Enhanced Video Renderer.

El mezclador es una transformación de Media Foundation (MFT) con una o varias entradas (la secuencia de referencia más las substreams) y una salida. El flujo de entrada recibe muestras de la cadena ascendente. El flujo de salida entrega ejemplos al moderador. El EVR es responsable de llamar a IMFTransform::ProcessInput en el mezclador, y el moderador es responsable de llamar a IMFTransform::ProcessOutput.

Como mínimo, un mezclador EVR debe implementar las interfaces siguientes:

Interfaz Descripción
IMFTransform Proporciona la funcionalidad de MFT base.
IMFTopologyServiceLookupClient Permite que el mezclador obtenga interfaces del EVR.
IMFVideoDeviceID Permite que el mezclador obtenga interfaces del EVR.
IMFAttributes Se usa para exponer el atributo MF_SA_D3D_AWARE al EVR.

 

Opcionalmente, un MFT puede implementar cualquiera de las interfaces siguientes:

Interfaz Descripción
IEVRTrustedVideoPlugin Necesario para reproducir contenido protegido.
IMFGetService Expone interfaces como IMFVideoMixerBitmap e IMFVideoProcessor a la aplicación.
IMFQualityAdvise Permite al administrador de calidad ajustar la calidad del vídeo.
IMFVideoMixerBitmap Permite que la aplicación combine un mapa de bits estático en el vídeo.
IMFVideoPositionMapper Asigna coordenadas en el fotograma de vídeo de salida a las coordenadas del fotograma de vídeo de entrada.
IMFVideoProcessor Expone algunas características de procesamiento de vídeo DXVA a la aplicación.

 

La negociación de formato con el mezclador funciona de la siguiente manera:

  1. El EVR establece el tipo de medio en la secuencia de referencia.

  2. El EVR llama a IMFVideoPresenter::ProcessMessage en el moderador con el mensaje MFVP_MESSAGE_INVALIDATEMEDIATYPE.

  3. El moderador establece el tipo de medio en el flujo de salida del mezclador.

  4. El EVR establece el tipo de medio en las substreams.

Si cambia el tipo de medio en la secuencia de referencia, los demás tipos de medios del mezclador ya no son válidos. El método IMFTransform::ProcessOutput del mezclador producirá un error y devolverá MF_E_TRANSFORM_STREAM_CHANGE. El moderador no debe hacer nada en este momento. El EVR iniciará de nuevo el proceso de negociación de formato.

Cuando cualquier flujo de entrada llega al final de la secuencia, el EVR llama a IMFTransform::ProcessMessage en el mezclador con MFT_MESSAGE_NOTIFY_END_OF_STREAM.

El mezclador envía los siguientes eventos al EVR mediante la interfaz IMediaEventSink de EVR. Esta interfaz se documenta en la documentación del SDK de DirectShow.

Evento Descripción
EC_SAMPLE_NEEDED El mezclador requiere un nuevo ejemplo de entrada.

 

El EVR podría llamar a ProcessOutput en el mezclador antes de que se inicie el streaming. El mezclador no debe producir un error en estas llamadas. En su lugar, debe rellenar la superficie de salida con píxeles negros. El mezclador debe seguir rellenando muestras de salida de color hasta que reciba un mensaje de MFT_MESSAGE_NOTIFY_BEGIN_STREAMING o se llame al método ProcessInput. Si el mezclador recibe un mensaje de MFT_MESSAGE_NOTIFY_END_STREAMING, debe volver al modo de relleno de color.

Implementación de IMFVideoDeviceID

La interfaz IMFVideoDeviceID contiene un método, GetDeviceID, que devuelve un GUID de dispositivo. El GUID de dispositivo garantiza que el moderador y el mezclador usen tecnologías compatibles. Si los GUID de dispositivo no coinciden, el EVR no se puede inicializar.

El mezclador estándar y el moderador usan Direct3D 9, con el GUID de dispositivo igual a IID_IDirect3DDevice9. Si piensa usar el moderador personalizado con el mezclador estándar, el GUID de dispositivo del moderador debe ser IID_IDirect3DDevice9. Si reemplaza ambos componentes, podría definir un nuevo GUID de dispositivo.

Implementación de IMFTopologyServiceLookupClient

El mezclador debe implementar la interfaz IMFTopologyServiceLookupClient. Antes de que comience el streaming, el EVR llama a IMFTopologyServiceLookupClient::InitServicePointers y pasa un puntero a la interfaz IMFTopologyServiceLookup de EVR. El mezclador usa este puntero para obtener punteros de interfaz del EVR.

Como mínimo, el mezclador debe consultar la siguiente interfaz:

Cuando el EVR llama a IMFTopologyServiceLookupClient::ReleaseServicePointers, el mezclador debe liberar los punteros obtenidos de la llamada a InitServicePointers.

Atributos de mezclador

Un mezclador debe admitir los siguientes atributos.

Atributo Descripción
MF_SA_D3D_AWARE Especifica si el mezclador admite la aceleración de vídeo DirectX (DXVA).
MF_SA_REQUIRED_SAMPLE_COUNT El número de muestras de vídeo que el EVR debe asignar para cada flujo del mezclador. Este atributo se aplica a secuencias individuales. Use el almacén de atributos devuelto por IMFTransform::GetInputStreamAttributes.

 

Establecimiento del mezclador en el EVR

Para establecer un mezclador personalizado en el EVR, llame a IMFVideoRenderer::InitializeRenderer. Tanto el filtro DirectShow EVR como el receptor multimedia EVR implementan este método.

Objeto de activación EVR. Si usa el objeto de activación EVR, puede proporcionar un mezclador personalizado estableciendo uno de los siguientes atributos en el objeto de activación EVR:

Atributo Descripción
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE Puntero a un objeto de activación para el mezclador. El objeto de activación debe implementar la interfaz IMFActivate.
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID CLSID del mezclador.

 

Representador de vídeo mejorado