2010-04-06 35 views
0

Je souhaite mettre un filigrane sur ma vidéo. Est-il possible de faire avec le filtre DirectShow. Vous souhaitez superposer une image sur une vidéo, comme un logo de chaîne. pour que l'image soit corrigée lors de la lecture de la vidéo.Filigranage + filtre Directshow

S'il vous plaît fournir une aide précieuse ou des échantillons (VC++)

Répondre

2

Je l'ai déjà fait. Vous avez deux options.

  1. Utilisez les capacités du mélangeur VMR-7 ou VMR-9. Je vous garantis que cela aura l'air vraiment moche, parce que les filtres VMR ne peuvent pas faire d'alpha-blending du tout. Votre filigrane aura des bords rugueux.

  2. Implémentez une classe de filtre dérivée de CTransInPlaceFilter.

Vous mettez en oeuvre les méthodes suivantes:

CheckMediaType (accept all RGB formats) 
    SetMediaType  (accept all RGB formats) 
    Transform  (this is where you do the overlay) 

Dans votre constructeur de filtre (ou sur une autre méthode qui est appelée avant l'exécution graphique), chargez votre filigrane de fichier ou de ressources. Enregistrez les bits bitmap du fichier image dans un tampon. Lorsque Transform est appelé, ouvrez l'échantillon IMediaSample transmis, accédez à son tampon et disposez d'une double boucle imbriquée pour copier chaque pixel du filigrane sur le tampon de l'image. Un problème avec tout cela est que votre source d'entrée n'est peut-être pas RVB natif. La plupart des webcams sont par exemple des sources YUV (ou pire, MJPG). En contraignant votre filtre à n'accepter que les types RVB, les filtres du convertisseur de couleurs DShow seront chargés. En tant que tel, latence supplémentaire peut être ajouté à votre graphique. En ce qui concerne l'alpha blending (si vous le voulez), vous êtes ici seul - le buffer source que vous êtes en train de mixer sera probablement RGB24 sans canal alpha.

+0

Il existe une option 3 plus simple: utiliser Sample Grabber et modifier le contenu vidéo en place lorsqu'il appelle votre callback. –