2009-10-26 6 views
17

Je veux développer un pilote de webcam virtuel qui, à partir du mode Utilisateur, me transmettra l'image et il affichera comme sortie de la 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 l'image de la webcam.Pilote Webcam Virtuel

Je dois écrire un pilote de périphérique en mode noyau ainsi.

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, seulement il affiche 7 couleurs dans la webcam ...

Toute aide serait grandement appréciée. Merci


Merci à tous!

J'ai essayé le code d'ici: http://tmhare.mvps.org/downloads.htm (trouver Filter Capture Source)

Il a bien fonctionné quand je compilé dans Yahoo, MSN, mais il écrasements AIM, Internet Explorer flash Webcam, Firefox flash webcam et Skype. .. Je suis en panne QueryInterface après 8 appel de temps à cela, je l'ai trouvé avec le suivi avec beaucoup de trucs ..

maintenant, je sais, il se bloque le 8 appel à HRESULT CVCamStream :: QueryInterface (REFIID riid , vide ** ppv)

8e appel quand il atteint pour durer si, je veux dire: return CSourceStream :: QueryInterface (riid, ppv);

Il est en 17e ligne de Filters.cpp

Pourquoi pensez-vous que je suis en train de plantage ??

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

+0

Vous voulez dire WDK et non DDK, n'est-ce pas? Aussi, pour avoir une meilleure idée de ce que vous cherchez, où est situé testcap dans les échantillons, je ne peux pas le trouver. – mrduclaw

+0

Encore une fois. N'essayez pas d'écrire un pilote, car les pilotes ont tendance à être très gros. Je vais essayer de regarder dans mon code pour enregistrer des périphériques logiciels, et le montrer ici. – Christopher

+0

Si vous devez vraiment aller le pilote Windows ... Voir [cette question] (http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service) pour une description sur la façon de communiquer avec un pilote de périphérique. Bonne chance. – Christopher

Répondre

4

Vous ne pouvez pas décider comment un autre programme, il faudrait conduire. La plupart des programmes utiliseront DirectShow. Certains utiliseraient la technologie win3.x VFW. Beaucoup de nouveaux programmes, y compris le scanner et l'assistant de caméra de Windows XP, peuvent vous appeler via l'interface WIA. Si vous ne voulez pas implémenter tout cela, vous avez besoin de at least provide the DirectShow interface via WDM et laissez vfwwdm32.dll vous donner une interface VFW, ou écrivez votre propre pilote VFW.

16

Plusieurs API de Microsoft permettent d'accéder aux données d'image.

  • Twain: Utilisé pour la capture d'image unique à partir de scanners, etc.
  • WIA: Cela semble avoir dégénéré à une seule bibliothèque codec d'image.
  • VfW: Une API très ancienne (Win16) qui ne fonctionne vraiment que pour le codage/décodage de fichiers vidéo, mais qui prend en charge certaines acquisitions vidéo.
  • DirectShow: précédemment partie du SDK 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 plus être adapté à la lecture/réencodage vidéo.
  • Bibliothèques spécifiques au fabricant: Pylône/Halcon/Contrôle d'image/...

spécifique DirectShow:

Pour créer des dispositifs d'acquisition d'images sous Windows, vous devez fournir soit un dispositif (conducteur), qui implémente les interfaces streamclasses (ou plus récent Avstream) ou vous devez écrire un objet COM usermode 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éelles. Seule la couche inférieure de l'appareil est réellement manquante.

Si vous pouvez concevoir un périphérique, vous devez soit le créer soit compatible DCAM ou UVC. Pour les deux, il y a des pilotes intégrés fournis par Windows.


Comment écrire un dispositif de source de logiciel:

Vous devez créer un filtre DirectShow qui fournit au moins une broche de sortie et enregistrer ce sous la VideoInputCategory. Il peut y avoir plusieurs interfaces nécessaires à certaines applications d'une application de capture, mais celles-ci dépendent de l'application elle-même. Les applications simples pour tester les filtres sont GraphEdit et AMCap qui sont fournis dans le SDK Plattform.

Certains code:

#include <InitGuid.h> 
#include <streams.h> 


const AMOVIESETUP_MEDIATYPE s_VideoPinType = 
{ 
    &MEDIATYPE_Video, // Major type 
    &MEDIATYPE_NULL  // Minor type 
}; 

const AMOVIESETUP_PIN s_VideoOutputPin = 
{ 
    L"Output",    // Pin string 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",   // String 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::wstring inputCat = GUIDToWString(CLSID_VideoInputDeviceCategory); 
    std::wstring 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 du périphérique virtuel ».

+1

article connexe sur ce faire de l'intérieur de C# http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in –