Partager via


Fourniture d’un redimensionneur vidéo personnalisé

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

[Cette API n’est pas prise en charge et peut être modifiée ou indisponible à l’avenir.]

Notes

Cette fonctionnalité nécessite DirectX 9.0 ou version ultérieure.

 

Lorsque DirectShow Editing Services (DES) redimensionne un clip de source vidéo, le comportement par défaut est StretchBlt, qui est rapide, mais pas anti-alias. Vous pouvez modifier le comportement de redimensionnement en implémentant un redimensionnement personnalisé en tant que filtre de transformation DirectShow. Le filtre doit exposer l’interface IResize , qui permet à DES de spécifier la taille de la vidéo d’entrée et de sortie. Pour plus d’informations sur l’écriture d’un filtre de transformation, consultez Écriture de filtres de transformation. La classe de base CTransformFilter est recommandée comme point de départ. Lorsque vous implémentez le filtre, notez ce qui suit :

  • Prise en charge de l’interface IResize sur le filtre (pas les broches).
  • Le filtre doit accepter uniquement les formats VIDEOINFOHEADER (FORMAT_VideoInfo). Rejeter les autres types de format.
  • Le format vidéo de DES peut être n’importe quel type RVB non compressé, y compris RVB 32 bits avec alpha (MEDIASUBTYPE_ARGB32). Votre filtre peut rejeter en toute sécurité les formats avec biHeight< 0.
  • Avant que le moteur de rendu ne connecte la broche de sortie du filtre, il appelle IResize::p ut_MediaType pour définir le type de sortie. Il peut également appeler IResize::p ut_Size pour ajuster la taille de sortie. Il peut appeler ces deux méthodes dans n’importe quel ordre, n’importe quel nombre de fois, avant de connecter la broche de sortie.
  • Une fois que le moteur de rendu a connecté la broche de sortie, il peut appeler à nouveau put_Size . Le filtre de redimensionnement doit reconnecter sa broche de sortie avec la nouvelle taille.
  • À l’intérieur de la méthode CTransformFilter::Transform du filtre, étendez la vidéo d’entrée à la taille de sortie.
  • Votre filtre ne doit jamais définir l’indicateur de discontinuité sur l’exemple de sortie, ni attacher un type de média à l’exemple de sortie.
  • Pour enregistrer l’état du filtre dans un fichier GraphEdit (.grf), implémentez l’interface IPersistStream . (Cette option est facultative, mais utile pour les tests.)

Pour utiliser le filtre de redimensionnement, le filtre doit être inscrit en tant qu’objet COM sur le système de l’utilisateur. Avant que l’application ne restitue le projet vidéo, interrogez le moteur de rendu pour l’interface IRenderEngine2 et appelez IRenderEngine2::SetResizerGUID avec le CLSID du filtre de redimensionnement.

Rendu d’un projet