Share via


Uso de los controles del mezclador de vídeo

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

El mezclador EVR proporciona varias interfaces que una aplicación puede utilizar para controlar la forma en que el mezclador procesa el vídeo. Estas interfaces se pueden usar en DirectShow o Media Foundation.

Interfaz Descripción
Interfaz IMFVideoMixerBitmap Alfa combina una imagen de mapa de bits estática en el vídeo.
Interfaz IMFVideoMixerControl Controla cómo el EVR mezcla subsecuencias de vídeo.
Interfaz IMFVideoProcessor Controla el ajuste de color, los filtros de imagen y otras funcionalidades de procesamiento de vídeo. Esta interfaz proporciona acceso a la funcionalidad implementada por el controlador de gráficos, por lo que las funcionalidades exactas dependerán del controlador de gráficos del usuario.

 

La forma correcta de obtener punteros a estas interfaces depende de si utiliza la versión DirectShow del EVR o la versión Media Foundation. Para EVR de Media Foundation, también depende de si se usa el EVR directamente o se usa a través de la sesión multimedia. (Normalmente, una aplicación usará el EVR a través de la sesión multimedia, no directamente).

Para obtener un puntero a cualquiera de estas interfaces, haga lo siguiente:

  1. Obtenga un puntero a la interfaz IMFGetService en el EVR.

    • Si usa el filtro DirectShow EVR, llame a QueryInterface en el filtro.

    • Si usa el receptor multimedia EVR directamente, llame a QueryInterface en el receptor multimedia.

    • Si usa la sesión multimedia, llame a QueryInterface en la sesión multimedia.

  2. Si usa la sesión multimedia, espere a que la sesión multimedia envíe el evento MESessionTopologyStatus con un valor de estado de MF_TOPOSTATUS_READY. (Omita este paso si no usa la sesión multimedia).

  3. Llame a IMFGetService::GetService para obtener la interfaz de mezclador. Use el identificador de servicio MR_VIDEO_MIXER_SERVICE.

Combinación alfa de un mapa de bits en el vídeo

Puedes usar la interfaz IMFVideoMixerBitmap para mezclar un mapa de bits estático en el vídeo durante la reproducción. Puede almacenar el mapa de bits en una superficie de Direct3D, especificado como puntero IDirect3DSurface9 o usar un mapa de bits GDI.

Si usa una superficie de Direct3D para el mapa de bits, la superficie puede contener datos alfa por píxel, que se usarán cuando el mezclador combine la imagen. Como alternativa, puede definir una clave de color, es decir, un único color que será transparente donde aparezca en el mapa de bits. Además, puede especificar un valor alfa que se aplicará a toda la imagen. También puede establecer un rectángulo de origen para recortar el mapa de bits y un rectángulo de destino para colocar el mapa de bits dentro del fotograma de vídeo.

Para establecer el mapa de bits, llame a IMFVideoMixerBitmap::SetAlphaBitmap. Este método toma un puntero a una estructura MFVideoAlphaBitmap que especifica el mapa de bits y los parámetros de combinación alfa. Para obtener código de ejemplo, consulte el tema de referencia del método SetAlphaBitmap.

Después de establecer el mapa de bits, puede actualizar los parámetros de combinación, incluidos los rectángulos de origen y destino, llamando a IMFVideoMixerBitmap::UpdateAlphaBitmapParameters. La actualización surte efecto en el siguiente fotograma de vídeo. El vídeo debe reproducirse para que se produzca la actualización. Puede usar este método para realizar animaciones simples en el mapa de bits. (Si necesita efectos más sofisticados, considere la posibilidad de escribir un mezclador EVR personalizado).

Para borrar el mapa de bits, llame a IMFVideoMixerBitmap::ClearAlphaBitmap.

Control de subsecuencias

El EVR puede mezclar una o varias subsecuencias de vídeo en la secuencia de vídeo principal. Para controlar la mezcla de subsecuencias, use la interfaz IMFVideoMixerControl.

  • Llame a IMFVideoMixerControl::SetStreamOutputRect para establecer la posición de una subsecuencia dentro del fotograma de vídeo compuesto.

  • Llame a IMFVideoMixerControl::SetStreamZOrder para establecer el orden Z para las subsecuencias. El EVR dibuja las secuencias de vídeo en el orden de sus valores de orden Z, empezando por cero. La secuencia de vídeo principal siempre está en primer lugar en el orden Z.

Configuración de procesador de vídeo

El mezclador EVR usa la aceleración de vídeo DirectX (DXVA) para realizar el procesamiento de vídeo en los flujos de entrada. Las funcionalidades de procesamiento exactas dependen del controlador de gráficos. Las funcionalidades de procesamiento de vídeo se describen mediante la estructura DXVA2_VideoProcessorCaps. Un conjunto determinado de funcionalidades se denomina modo de procesamiento de vídeo, cada modo identificado por un GUID. Para obtener una lista de GUID predefinidos, consulte IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. El controlador puede definir GUID adicionales específicos del proveedor, que representan diferentes combinaciones de funcionalidades.

Para buscar los modos admitidos y las funcionalidades de cada modo, haga lo siguiente:

  1. Llame a IMFGetService::GetService para obtener un puntero a la interfaz IMFVideoProcessor del mezclador.

  2. Llame a IMFVideoProcessor::GetAvailableVideoProcessorModes. Este método devuelve una matriz de GUID, que identifica los modos de procesador de vídeo disponibles. La lista se devuelve en orden descendente de calidad, el modo con la mayor calidad aparece primero en la lista. La lista puede cambiar según el formato del vídeo.

  3. Para cada GUID de la lista, llame a IMFVideoProcessor::GetVideoProcessorCaps para encontrar las funcionalidades del modo de procesador de vídeo correspondiente. El método rellena una estructura DXVA2_VideoProcessorCaps con una descripción de las funcionalidades.

  4. Para seleccionar un modo, llame a IMFVideoProcessor::SetVideoProcessorMode. De lo contrario, el EVR selecciona automáticamente un modo cuando comienza el streaming. En ese caso, puede llamar a IMFVideoProcessor::GetVideoProcessorMode para buscar qué modo se seleccionó.

La mayoría de los campos de la estructura DXVA2_VideoProcessorCaps describen el comportamiento del controlador de bajo nivel y no son de interés en una aplicación típica. Lo más probable es que le interesen los siguientes campos:

  • DeviceCaps. Este campo indica si el procesamiento de vídeo se realiza en hardware o software y si el controlador gráfico es un controlador DXVA 1.0 anterior.

  • DeinterlaceTechnology. Este campo proporciona alguna indicación de qué nivel de calidad de desentrelazado puede esperar si el vídeo de origen está entrelazado.

  • ProcAmpControlCaps. Este campo especifica qué controles de ajuste de color están disponibles. Para obtener una lista de posibles ajustes de color, consulte Configuración de ProcAmp. Si el controlador no puede realizar el ajuste de color, este campo es cero.

  • VideoProcessorOperations. Este campo contiene marcas que describen varias funcionalidades de procesamiento de vídeo. Dos marcas de importancia particular son las marcas DXVA2_VideoProcess_SubStreams y DXDXVA2_VideoProcess_SubStreams. Al menos una de estas marcas debe estar presente para que el EVR combine subsecuencias en la secuencia de vídeo de referencia. Si ninguna marca está presente, el EVR se limita a una secuencia de vídeo.

  • NoiseFilterTechnology. Este campo indica qué filtros de ruido son compatibles con el controlador de gráficos. Si el controlador no admite el filtrado de ruido, el valor es DXVA2_NoiseFilterTech_Unsupported.

  • DetailFilterTechnology. Este campo indica qué filtros de detalle son compatibles con el controlador de gráficos. Si el controlador no admite el filtrado de ruido, el valor es DXVA2_DetailFilterTech_Unsupported.

Ajuste de color y filtrado de imágenes

El controlador de gráficos puede admitir el ajuste de color (también denominado amplificación del proceso o simplemente ProcAmp) y el filtrado de imágenes. Cuando lo realiza la GPU, el ajuste de color y el filtrado de imágenes se pueden realizar en tiempo real sin sobrecarga de CPU.

Para usar estas características, siga estos pasos:

  1. Seleccione un modo de procesamiento de vídeo como se describe en la sección anterior.

  2. Llame a IMFVideoProcessor::GetVideoProcessorCaps para encontrar las funcionalidades de procesamiento de vídeo tal como se describe en la sección anterior. El método rellena una estructura DXVA2_VideoProcessorCaps que describe las funcionalidades, incluido si el controlador admite el ajuste de color y el filtro de imagen.

  3. Para cada ajuste de color compatible con el controlador, llame a IMFVideoProcessor::GetProcAmpRange para encontrar el intervalo de valor posible para esa configuración. Este método también devuelve el valor predeterminado para la configuración. Llame a IMFVideoProcessor::GetProcAmpValues para encontrar el valor actual de la configuración. Los valores no tienen unidades especificadas. Es necesario que el controlador defina el intervalo de valores.

  4. Llame a IMFVideoProcessor::SetFilteringValue para establecer un valor de ajuste de color.

  5. Si el controlador admite el filtrado de imágenes, cada tipo de filtro (ruido y detalle) admite tres configuraciones (nivel, radio y umbral) tanto en croma como en luma. (Consulte Configuración del filtro de imagen DXVA). Para cada configuración, llame a IMFVideoProcessor::GetFilteringRange para obtener el intervalo de valores posibles y llame a IMFVideoProcessor::GetFilteringValue para obtener el valor actual.

  6. Para cambiar una configuración de filtro de imagen, llame a IMFVideoProcessor::SetFilteringValue.

Representador de vídeo mejorado