Share via


Uso de los controles de visualización 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 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].

La interfaz IMFVideoDisplayControl controla el modo en que el representador de vídeo mejorado (EVR) muestra el vídeo dentro de una ventana de aplicación. Esta interfaz se puede usar en DirectShow o Media Foundation. Internamente, los controles de visualización de vídeo los proporciona el presentador predeterminado del EVR. Si escribe un presentador personalizado, puede proporcionar la misma interfaz o definir una interfaz personalizada.

La forma correcta de obtener un puntero a la interfaz IMFVideoDisplayControl depende de si está usando la versión DirectShow del EVR o la versión Media Foundation. En el caso del EVR de Media Foundation, también depende de si está usando el EVR directamente o usándolo a través de la sesión multimedia (que es lo más típico).

Para obtener un puntero a la interfaz IMFVideoDisplayControl, haga lo siguiente:

  1. Obtenga un puntero a la interfaz IMFGetService.

    • 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 de lo contrario).

  3. Llame a IMFGetService::GetService para obtener la interfaz IMFVideoDisplayControl. El identificador de servicio es MR_VIDEO_RENDER_SERVICE.

Puede usar la interfaz IMFVideoDisplayControl para realizar las siguientes tareas:

  • Establecer la ventana de recorte.

  • Establecer los rectángulos de origen y destino.

  • Actualizar la ventana de vídeo en respuesta a los mensajes de ventana.

  • Habilitar o deshabilitar el modo de pantalla completa.

Ventana de recorte

La aplicación debe proporcionar una ventana en la que el EVR dibuja el vídeo. Para establecer la ventana de recorte, llame a IMFVideoDisplayControl::SetVideoWindow con un identificador en la ventana de la aplicación.

Si crea el receptor de medios EVR a través de su objeto de activación, este paso no es necesario. El objeto de activación llama automáticamente a SetVideoWindow, usando el controlador de ventana que proporcionó en la función MFCreateVideoRendererActivate.

Rectángulos de origen y destino

Durante la reproducción, el presentador toma una parte de la imagen de vídeo compuesta y la dibuja en un área de la ventana de vídeo. La parte de la imagen compuesta es el rectángulo de origen y el área de la ventana de vídeo es el rectángulo de destino.

El rectángulo de origen se define mediante coordenadas normalizadas donde el punto (0,0, 0,0) corresponde a la esquina superior izquierda del vídeo y (1,0, 1,0) corresponde a la esquina inferior derecha del vídeo. El rectángulo de origen puede ser cualquier región dentro de este rectángulo. El rectángulo de destino se especifica en píxeles, en relación con el área del cliente de la ventana. El rectángulo de origen predeterminado es toda la imagen y el rectángulo de destino predeterminado es un rectángulo vacío.

Para establecer los rectángulos de origen y destino, llame a IMFVideoDisplayControl::SetVideoPosition.

Si crea el receptor de medios EVR a través de su objeto de activación, este paso no es necesario. El objeto de activación establece automáticamente el rectángulo de destino igual al área de cliente completa de la ventana. Sin embargo, debe llamar a SetVideoPosition si desea cambiar el rectángulo de origen o establecer un rectángulo de destino diferente.

Mensajes de ventana

Durante la reproducción, la aplicación debe responder a determinados mensajes de ventana, como se indica a continuación:

  • WM_PAINT: llame a IMFVideoDisplayControl::RepaintVideo para volver a dibujar el vídeo. Además, evite pintar sobre el rectángulo de destino mientras se reproduce el vídeo, ya que esto puede provocar parpadeo.

  • WM_SIZE: es posible que tenga que llamar a SetVideoPosition para cambiar el tamaño del rectángulo de destino.

A diferencia del filtro Video Mixing Renderer (VMR) de DirectShow, no tiene que notificar al EVR cuando reciba un mensaje WM_DISPLAYCHANGE.

Representador de vídeo mejorado