Pilote de webcam virtuelle

Je souhaite développer un pilote de webcam virtuelle auquel, en mode utilisateur, je lui transmettrai une image qui s’affichera sous forme de sortie webcam.

Je ne veux pas utiliser le filtre DirectX et CSourceStream, etc. Parce qu’ils ne fonctionnent pas sur certains programmes qui n’utilisent pas DirectX pour capturer une image de webcam.

Je dois écrire un pilote de périphérique en mode kernel, donc.

Des idées? J’ai essayé testcap à partir d’échantillons DDK, mais il ne traite pas l’image du mode utilisateur et ne reçoit aucune entrée, il affiche simplement 7 couleurs dans la webcam …

Toute aide serait grandement appréciée. Merci


Merci à tous!

J’ai essayé le code à partir d’ici: http://tmhare.mvps.org/downloads.htm (find Capture Source Filter)

Cela a bien fonctionné quand je l’ai compilé dans Yahoo, MSN, mais il s’est écrasé. Il a planté dans QueryInterface après 8 fois cet appel, je l’ai trouvé en le traçant avec un beaucoup de trucs ..

Maintenant, je sais, il se bloque lors du 8ème appel à HRESULT CVCamStream :: QueryInterface (REFIID riid, void ** ppv)

8ème appel quand il durera si, je veux dire: return CSourceStream :: QueryInterface (riid, ppv);

C’est dans la 17ème ligne de Filters.cpp

Pourquoi crois-tu que je vais avoir un crash ??

Merci à tous de me guider pour trouver la solution correcte qui est DirectShow, pas pilote

Plusieurs API de Microsoft fournissent un access aux données d’image.

  • Twain: Utilisé pour la capture d’images uniques à partir de scanners, etc.
  • WIA: Cela semble avoir dégénéré en une seule bibliothèque de codecs d’images.
  • VfW: Une très ancienne API (Win16) qui ne fonctionne vraiment que l’encodage / décodage de fichiers vidéo, mais prend en charge certaines acquisitions vidéo.
  • DirectShow: précédemment inclus dans le Kit de développement DirectX, actuellement dans le Kit de développement Platform SDK. C’est l’endroit où aller pour les solutions de streaming actuelles (générales).
  • Windows Media / Media Foundation: Cela semble davantage être destiné à la lecture / réencodage vidéo.
  • Bibliothèques spécifiques au fabricant: Pylon / Halcon / Imaging Control / …

Spécifique à DirectShow:

Pour créer des périphériques d’acquisition d’images sous Windows, vous devez fournir un périphérique (pilote) implémentant les interfaces streamclasses (ou une version plus récente d’Avstream) ou écrire un object COM utilisateur en mode utilisateur, qui doit être ajouté à l’énumérateur VideoInputCategory.

L’exemple Avstream fournit tout ce qu’il faut pour un périphérique d’acquisition d’images réel. Seule la couche inférieure de l’appareil réel manque réellement.

Si vous pouvez concevoir un appareil, vous devez le créer compatible DCAM ou UVC. Pour les deux, des pilotes intégrés sont fournis par Windows.


Comment écrire un périphérique source de logiciel:

Vous devez créer un filtre DirectShow fournissant au moins une broche de sortie et l’enregistrer dans la catégorie VideoInputCategory. Il peut y avoir plusieurs interfaces requirejses par certaines applications par une application de capture, mais celles-ci dépendent de l’application elle-même. Les applications simples permettant d’essayer les filtres sont GraphEdit et AMCap, fournies dans le SDK Plattform.

Un code:

#include  #include  const AMOVIESETUP_MEDIATYPE s_VideoPinType = { &MEDIATYPE_Video, // Major type &MEDIATYPE_NULL // Minor type }; const AMOVIESETUP_PIN s_VideoOutputPin = { L"Output", // Pin ssortingng name FALSE, // Is it rendered TRUE, // Is it an output FALSE, // Can we have none FALSE, // Can we have many &CLSID_NULL, // Connects to filter NULL, // Connects to pin 1, // Number of types &s_VideoPinType // Pin details }; const AMOVIESETUP_FILTER s_Filter = { &CLSID_MyFilter, // Filter CLSID L"bla", // Ssortingng name MERIT_DO_NOT_USE, // Filter merit 1, // Number pins &s_VideoOutputPin // Pin details }; REGFILTER2 rf2; rf2.dwVersion = 1; rf2.dwMerit = MERIT_DO_NOT_USE; rf2.cPins = 1; rf2.rgPins = s_Filter.lpPin; HRESULT hr = pFilterMapper->RegisterFilter( CLSID_MyFilter, _FriendlyName.c_str(), 0, &CLSID_VideoInputDeviceCategory, _InstanceID.c_str(), &rf2 ); if( FAILED( hr ) ) { return false; } std::wssortingng inputCat = GUIDToWSsortingng( CLSID_VideoInputDeviceCategory ); std::wssortingng regPath = L"CLSID\\" + inputCat + L"\\Instance"; win32_utils::CRegKey hKeyInstancesDir; LONG rval = openKey( HKEY_CLASSES_ROOT, regPath, KEY_WRITE, hKeyInstancesDir ); if( rval == ERROR_SUCCESS ) { win32_utils::CRegKey hKeyInstance; rval = createKey( hKeyInstancesDir, _InstanceID, KEY_WRITE, hKeyInstance ); .... 

_InstanceID est un GUID créé pour cette entrée ‘périphérique virtuel’.

Vous ne pouvez pas décider comment un autre programme appelle votre pilote. La plupart des programmes utiliseront DirectShow. Certains utiliseraient la technologie win3.x VFW. De nombreux nouveaux programmes, y compris le scanner et l’assistant de l’appareil photo de Windows XP, peuvent vous appeler via l’interface WIA. Si vous ne souhaitez pas implémenter tout cela, vous devez au moins fournir l’interface DirectShow via WDM et laisser vfwwdm32.dll vous fournir une interface VFW ou écrire votre propre pilote VFW.