Utiliser les contrôles d’affichage vidéo

[Le composant décrit sur cette page, Convertisseur vidéo amélioré, est une fonctionnalité héritée. Il a été remplacé par le Convertisseur vidéo simple (SVR) exposé à travers les composants MediaPlayer et IMFMediaEngine. Pour lire du contenu vidéo, vous devez envoyer des données dans l’un de ces composants et les autoriser à instancier le nouveau convertisseur vidéo. Ces composants ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement, dans la mesure du possible, que le nouveau code utilise MediaPlayer ou les API de bas niveau IMFMediaEngine pour lire des médias vidéo dans Windows au lieu de l’EVR. Microsoft recommande, si possible, la réécriture du code existant qui utilise les API héritées pour être à jour avec les nouvelles API.]

L’interface IMFVideoDisplayControl contrôle la façon dont le convertisseur vidéo amélioré (EVR) affiche la vidéo dans une fenêtre d’application. Cette interface peut être utilisée dans DirectShow ou Media Foundation. En interne, les contrôles d’affichage vidéo sont fournis par le présentateur par défaut de l’EVR. Si vous écrivez un présentateur personnalisé, vous pouvez fournir la même interface ou définir une interface personnalisée.

La bonne façon d’obtenir un pointeur vers l’interface IMFVideoDisplayControl varie selon que vous utilisez la version DirectShow de l’EVR ou la version Media Foundation. Pour l’EVR Media Foundation, elle varie également selon que vous utilisez directement l’EVR ou via la session multimédia (ce qui est le cas le plus courant).

Pour obtenir un pointeur vers l’interface IMFVideoDisplayControl, procédez comme suit :

  1. Obtenez un pointeur vers l’interface IMFGetService.

    • Si vous utilisez le filtre DirectShow EVR, appelez QueryInterface sur le filtre.

    • Si vous utilisez directement le récepteur multimédia EVR, appelez QueryInterface sur le récepteur multimédia.

    • Si vous utilisez la session multimédia, appelez QueryInterface sur la session multimédia.

  2. Si vous utilisez la session multimédia, attendez qu’elle envoie l’événement MESessionTopologyStatus avec la valeur d’état MF_TOPOSTATUS_READY. (Sinon, ignorez cette étape.)

  3. Appelez IMFGetService::GetService pour obtenir l’interface IMFVideoDisplayControl. L’identificateur de service est MR_VIDEO_RENDER_SERVICE.

Vous pouvez utiliser l’interface IMFVideoDisplayControl pour effectuer les tâches suivantes :

  • Définissez la fenêtre de découpage.

  • Définissez les rectangles source et de destination.

  • Mettez à jour la fenêtre de vidéo en réponse aux messages de fenêtre.

  • Activez ou désactivez le mode plein écran.

Fenêtre de découpage

L’application doit fournir une fenêtre où l’EVR dessine la vidéo. Pour définir la fenêtre de découpage, appelez IMFVideoDisplayControl::SetVideoWindow avec une poignée sur la fenêtre d’application.

Si vous créez le récepteur multimédia EVR via son objet d’activation, cette étape n’est pas nécessaire. L’objet d’activation appelle automatiquement SetVideoWindow à l’aide de la poignée de fenêtre que vous avez fournei dans la fonction MFCreateVideoRendererActivate.

Rectangles sources/de destination

Pendant la lecture, le présentateur prend une partie de l’image vidéo composite et la dessine sur une zone de la fenêtre vidéo. La partie de l’image composite est le rectangle source et la zone de la fenêtre vidéo est le rectangle de destination.

Le rectangle source est défini à l’aide de coordonnées normalisées où le point (0.0, 0.0) correspond au coin supérieur gauche de la vidéo et (1.0, 1.0) correspond au coin inférieur droit de la vidéo. Le rectangle source peut être n’importe quelle région de ce rectangle. Le rectangle de destination est spécifié en pixels par rapport à la zone cliente de la fenêtre. Le rectangle source par défaut est l’image entière et le rectangle de destination par défaut est un rectangle vide.

Pour définir les rectangles source et de destination, appelez IMFVideoDisplayControl::SetVideoPosition.

Si vous créez le récepteur multimédia EVR via son objet d’activation, cette étape n’est pas nécessaire. L’objet d’activation définit automatiquement le rectangle de destination en fonction de la zone cliente entière de la fenêtre. Toutefois, vous devez appeler SetVideoPosition si vous souhaitez modifier le rectangle source ou définir un autre rectangle de destination.

Messages de fenêtre

Pendant la lecture, votre application doit répondre à certains messages de fenêtre, comme suit :

  • WM_PAINT : appelez IMFVideoDisplayControl::RepaintVideo pour repeindre la vidéo. En outre, évitez de peindre sur le rectangle de destination pendant la lecture de la vidéo, car cela peut provoquer du scintillement.

  • WM_SIZE : vous devrez peut-être appeler SetVideoPosition pour redimensionner le rectangle de destination.

Contrairement au filtre du convertisseur de mixage vidéo (VMR) dans DirectShow, vous n’avez pas besoin d’avertir l’EVR lorsque vous recevez un message WM_DISPLAYCHANGE.

Convertisseur vidéo amélioré