Meilleur DirectShow moyen de capture d'image à partir de la web cam aperçu ? SampleGrabber est obsolète
J'ai développé DirectShow C++ application avec succès des aperçus web cam afficher dans la fenêtre. Maintenant, je veux capturer une image à partir de ce live web cam aperçu. J'ai utilisé graphique manager, ICaptureGraphBuilder2, IMoniker etc. pour cela.
J'ai cherché et trouvé une des options suivantes:
WIA & Exemple de Grabber.
De nombreux recommande l'utilisation de SampleGrabber mais comme par MS msdn de document SampleGrabber est obsolète, et on ne devrait pas utiliser. Et je ne veux pas utiliser WIA API.
Alors, qui est le meilleur DirectShow façon de capturer l'image de webcam live preview?
OriginalL'auteur Engineer | 2012-07-09
Vous devez vous connecter pour publier un commentaire.
Voici une citation de DxSnap échantillon de DirectShow.NET bibliothèque:
C'est le code C#, mais vous devriez obtenir l'idée que les interfaces sont tous les mêmes. Et il y a d'autres exemples sur la façon d'utiliser
Sample Grabber Filter
en C++.Échantillon Grabber est obsolète, les en-têtes sont supprimés à partir d'un couple de dernier Sdk, cependant les composants d'exécution sont tous là et vont être là pour une longue période de temps, ou sinon une multitude d'application serait cassé (par exemple, le Chat Vidéo dans le navigateur hébergé GMail est Échantillon à l'aide d'une Pince). Donc, fondamentalement, l'Échantillon Grabber est encore un moyen facile de capturer des instantanés à partir d'une caméra web, ou si vous sinon préfèrent suivre la dernière MS Api - vous voulez regarder dans les Médias de la Fondation (09 Juillet 2016 mise à jour: Windows Server installations pourriez avoir besoin pour ajouter de la "Media Foundation" et/ou "Bureau" fonctionnalités pour rendre les Médias de la Fondation de l'API disponible, avec DirectShow, et DirectShow Editing Services, Exemple de Grabber est une partie de qui. Installation par défaut n'offre pas de qedit.dll hors de la boîte).
Aussi en C++, vous avez certainement n'avez pas à utiliser des exemples de Saisie du Filtre. Vous pouvez développer un filtre personnalisé en utilisant DirectShow BaseClasses à une transformation personnalisée filtre ou un moteur de rendu personnalisé, pour accepter les flux vidéo et d'exporter les images à partir de l'DirectShow pipeline. Une autre option est d'utiliser des exemples de Saisie du code source de l'exemple de l'un des plus anciens Kits de développement logiciel (qui n'est pas la source exacte de l'OS de l'Échantillon Grabber, mais il est en train de faire la même chose). Le point, cependant, que l'Échantillon Grabber livré avec Windows, c'est toujours une bonne option.
Merci Romain.R. J'ai écrit WIA code de capturer des image pendant quelques heures, puis a été d'obtenir l'erreur de lancer WIAVideo objet et constaté que "WIA ne prend pas en charge les périphériques vidéo dans Windows Server 2003, Windows Vista, ou plus tard.". Maintenant, je pense que la seule option est de DirectShow et à l'aide de SampleGrabber qui est obsolète. Si mauvais MME
toute aide sur la capture d'une image à l'aide de DirectShow, sauf ISampleGrabber. S'il vous plaît...
Vous avez les pointeurs ci-dessus, l'exemple de saisie ou de l'échantillon grabber comme privé de filtre, il est tout à vous de choisir.
SampleGrabber est obsolète. Je sais, cependant, les gens de l'utiliser mais il n'est pas recommandé par Microsoft. Donc, de toute autre manière, sauf ISampleGrabber?
OriginalL'auteur Roman R.
Répertoriés sur le site web de Microsoft est un exemple de comment faire pour capturer une image à l'aide IVMRWindowlessControl9::GetCurrentImage ... Voici une façon de le faire:
L'exemple fourni par Microsoft est situé à msdn.microsoft.com/en-us/library/windows/desktop/... L'exemple par Microsoft n'a pas inclus la copie bitmap code; j'ai obtenu le code de la exemples emballés dans l'ancien SDK de DirectX.
OriginalL'auteur AhiyaHiya
jeez... tant de dis-de l'information. si vous êtes aperçu dans un directshow graphique, ensuite, cela dépend de ce que vous êtes aperçu. Des filtres de Capture ont 1, 2 ou 3 broches. Si il y a 1 broche, il est plus probable une "capture" pin (pas d'aperçu pin). Pour cela, si vous voulez capturer et de le prévisualiser dans le même temps, vous devriez mettre dans un "Smart Tee" du filtre, et de connecter le VMR hors de l'aperçu de pin, et d'accrocher "quelque chose que l'accaparement des cadres" hors de la capture de pin. puisque vous ne voulez pas faire l'imbécile avec DirectShow minable pin start/stop (à la place, il suffit de contrôler l'intégralité du graphique de démarrage/arrêt de l'état). Vous n'avez pas besoin d'utiliser un SampleGrabber, c'est un mort-filtre simple et vous pouvez l'écrire en quelques heures (je devrais le savoir, je suis celui qui l'a écrit). c'est tout simplement une CTransInPlace filtre que vous pouvez définir une contrainte de type de média pour elle d'accepter, et vous pouvez définir une interface de rappel pour vous rappeler quand il reçoit un échantillon. C'est effectivement plus simple à écrire un NullRenderer qui vous appelle en arrière quand il reçoit un exemple, vous pourriez écrire assez facilement.
Si le filtre de capture a 2 broches, il est plus probable une capture pin et un code pin. dans ce cas, vous avez encore besoin d'un Smart Tee connecté à la source de la capture de pin, et de la nécessité d'aperçu au large de la smart tee aperçu de pin, et de capturer des échantillons de la smart té de la capture de pin.
(Si vous ne savez pas ce qu'est un SmartTee est, c'est un filtre qui joue allocateur astuces et envoie seulement un échantillon, l'aperçu de la broche si la capture pin n'est pas super enliser. C'est le travail est de fournir un chemin d'accès pour le VMR pour effectuer un rendu de ce qui n'est pas bousiller les allocateurs entre le filtre de capture et les filtres en aval du filtre de capture)
Si le filtre de capture a la capture et de l'aperçu des épingles, je pense que vous pouvez comprendre ce que vous devez faire ensuite.
De toute façon, résumé: La SampleGrabber est tout simplement un CTransInPlaceFilter. Vous pouvez l'écrire comme un Null moteur de Rendu, aussi, assurez-vous de remplir l'ordure dans CheckInputType, et d'appeler votre rappel de retour dans DoRenderSample.
OriginalL'auteur Ericf.