2009-10-26 11 views
17

Desidero sviluppare un driver di webcam virtuale che dalla modalità Utente passerà l'immagine ad esso e verrà visualizzato come uscita della webcam.Virtual Webcam Driver

Non voglio usare il filtro DirectX e CSourceStream ecc. Perché non funzionano su alcuni programmi che non usano DirectX per catturare l'immagine della webcam.

Devo scrivere un driver di periferica in modalità kernel così.

Qualche idea? Ho provato testcap da campioni DDK, ma non elabora l'immagine dalla modalità utente e non riceve alcun input, solo 7 colori in webcam ...

Qualsiasi aiuto sarebbe molto apprezzato. Grazie


Grazie a tutti!

ho provato il codice da qui: http://tmhare.mvps.org/downloads.htm (trovare il filtro Sorgente di cattura)

Ha funzionato bene quando ho compilato in Yahoo, MSN, ma si è schiantato AIM, Internet Explorer Webcam Flash, webcam Firefox Flash e Skype. .. ho accelerato di QueryInterface dopo 8 tempo di chiamata a questo, ho trovato con tracciando con un sacco di trucchi ..

Ora lo so, si blocca l'8 chiamata a HRESULT CVCamStream :: QueryInterface (riid REFIID , void ** ppv)

8a chiamata quando raggiunge per durare se, intendo: return CSourceStream :: QueryInterface (riid, ppv);

E 'in linea di 17 Filters.cpp

Perché pensi che mi sto incidente ??

Grazie a tutti per avermi guidato per trovare giusta soluzione che è DirectShow, non conducente

+0

Significa WDK e non DDK, giusto? Inoltre, per avere un'idea migliore di ciò che stai cercando, dove si trova il testcap negli esempi, non riesco a trovarlo. – mrduclaw

+0

Ancora una volta. Non provare a scrivere un driver, perché i driver tendono ad essere davvero molto grandi. Cercherò di esaminare il mio codice per registrare i dispositivi software e mostrarlo qui. – Christopher

+0

Se davvero devi seguire il driver Windows ... Vedi [questa domanda] (http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service) per una descrizione su come comunicare con un driver di dispositivo. In bocca al lupo. – Christopher

risposta

4

Non si può decidere come altro programma chiamerebbe il driver. La maggior parte dei programmi utilizzerà DirectShow. Alcuni userebbero la tecnologia win3.x VFW. Molti nuovi programmi, incluso lo scanner e la procedura guidata di Windows XP, possono chiamarti tramite l'interfaccia WIA. Se non si desidera implementare tutto ciò, è necessario at least provide the DirectShow interface tramite WDM e lasciare che vfwwdm32.dll fornisca un'interfaccia VFW o scrivere il proprio driver VFW.

16

Esistono diverse API di Microsoft che forniscono accesso ai dati di immagine.

  • Twain: Utilizzato per la cattura di una sola immagine da scanner, ecc
  • WIA: Questo sembra essere degenerato ad una singola immagine libreria di codec.
  • VfW: Un'API molto vecchia (Win16) che funziona solo con codifica/decodifica di file video, ma ha il supporto per l'acquisizione di alcuni video.
  • DirectShow: precedentemente parte nell'SDK di DirectX, attualmente in Platform SDK. Questo è il posto dove andare per le attuali soluzioni di streaming (generali).
  • Windows Media/Media Foundation: sembra più orientato alla riproduzione/ricodifica video.
  • Librerie specifiche del produttore: Pylon/Halcon/Imaging Control/...

DirectShow specifica:

Per creare i dispositivi di acquisizione di immagini in Windows, è necessario fornire un dispositivo di (driver) che implementa le interfacce streamclasses (o più recente AVStream) o si deve scrivere un oggetto usermode COM che deve essere aggiunto all'enumeratore VideoInputCategory.

L'esempio Avstream fornisce tutto per un vero dispositivo di acquisizione di immagini. Manca davvero solo lo strato inferiore per il dispositivo reale.

Se è possibile progettare un dispositivo, è necessario crearlo compatibile con DCAM o UVC. Per entrambi i driver sono forniti da Windows.


Come scrivere un dispositivo sorgente del software:

È necessario creare un filtro DirectShow che fornisce almeno un pin di uscita e registrare questo sotto la VideoInputCategory. Ci possono essere diverse interfacce che alcune applicazioni richiedono da un'applicazione di acquisizione, ma queste dipendono dall'applicazione stessa. Le semplici applicazioni per provare i filtri sono GraphEdit e AMCap che sono fornite nell'SDK di Plattform.

Alcuni codice:

#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 è un GUID creato per questo intervento 'dispositivo virtuale'.

+1

articolo correlato su come farlo da dentro C# http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in –