2009-10-26 11 views
17

Chcę opracować wirtualny sterownik kamery internetowej, który w trybie użytkownika prześlę obraz do niego i wyświetli się jako wyjście kamery.Sterownik wirtualnej kamery internetowej

Nie chcę używać filtra DirectX i CSourceStream itp. Ponieważ nie działają one w niektórych programach, które nie używają DirectX do przechwytywania obrazu z kamery internetowej.

Muszę napisać sterownik urządzenia trybu jądra tak.

Wszelkie pomysły? Próbowałem testcap z próbek DDK, ale nie przetwarza obrazu z trybu użytkownika i nie dostaje żadnych danych wejściowych, tylko wyświetla 7 kolorów w kamerze internetowej ...

Każda pomoc będzie bardzo ceniona. Dzięki


Dziękuję wszystkim!

Próbowałem kod tutaj: http://tmhare.mvps.org/downloads.htm (znaleźć przechwytywania Źródło Filter)

To działa dobrze, kiedy opracowano go w Yahoo, MSN, ale rozbił AIM Internet Explorer Flash Webcam, kamerę internetową Firefox Flash i Skype. .. mam awarię w QueryInterface po 8 czasu wywołania, że ​​znalazłem go śledzenie go z wielu sztuczek ..

teraz wiem, że zawiesza się 8 zaproszenia do HRESULT CVCamStream :: QueryInterface (REFIID riid , void ** ppv)

8. połączenie po osiągnięciu trwać, jeśli mam na myśli: return CSourceStream :: QueryInterface (riid, ppv);

Jest w 17 linii Filters.cpp

Dlaczego sądzisz Dostaję katastrofę ??

Dziękuję wszystkim za kierowanie mi znaleźć właściwe rozwiązanie, które jest DirectShow, nie kierowca

+0

Masz na myśli WDK, a nie DDK, prawda? Ponadto, aby uzyskać lepszy pomysł, czego szukasz, gdzie znajduje się testcap w próbkach, nie mogę go znaleźć. – mrduclaw

+0

Jeszcze raz. Nie próbuj pisać kierowcy, ponieważ kierowcy są naprawdę naprawdę spore. Postaram się przejrzeć mój kod, aby zarejestrować urządzenia programowe i pokazać je tutaj. – Christopher

+0

Jeśli naprawdę musisz przejść przez sterownik systemu Windows ... Zobacz [to pytanie] (http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service), aby uzyskać opis, jak komunikować się ze sterownikiem urządzenia. Powodzenia. – Christopher

Odpowiedz

4

Nie możesz zdecydować, jak inny program nazwałbym sterownik. Większość programów będzie korzystać z DirectShow. Niektórzy używają technologii VFW technologii win3.x. Wiele nowych programów, w tym skaner systemu Windows XP i kreator kamery, może wywoływać użytkownika za pośrednictwem interfejsu WIA. Jeśli nie chcesz zaimplementować tego wszystkiego, musisz at least provide the DirectShow interface przez WDM i niech vfwwdm32.dll daje interfejs VFW lub napisać własny sterownik VFW.

16

Istnieje kilka interfejsów API firmy Microsoft, które zapewniają dostęp do danych obrazu.

  • Twain: Służy do przechwytywania obrazu z pojedynczej skanerów, itp
  • WIA: Wydaje się, że zdegenerowane do pojedynczego obrazu kodeka bibliotece.
  • VfW: Bardzo stary (Win16) API, który naprawdę działa tylko kodowanie/dekodowanie plików wideo, ale obsługuje niektóre akwizycje wideo.
  • DirectShow: wcześniej część pakietu DirectX SDK, obecnie w zestawie SDK platformy. To jest miejsce, w którym można znaleźć aktualne (ogólne) rozwiązania do przesyłania strumieniowego.
  • Windows Media/Media Foundation: Wydaje się, że bardziej pasuje do odtwarzania/ponownego kodowania wideo.
  • Specyficzne biblioteki producentów: Pylon/Halcon/Kontrola obrazu/...

DirectShow specyficzny:

Aby utworzyć urządzeń akwizycji obrazu pod Windows, musisz podać albo urządzenie (sterownik), który implementuje interfejsy streamclasses (lub nowszy Avstream) lub trzeba napisać obiektu usermode COM który musi zostać dodany do modułu wyliczającego VideoInputCategory.

Próbka Avstream zapewnia wszystko dla prawdziwego urządzenia do pozyskiwania obrazów. Brakuje tylko dolnej warstwy rzeczywistego urządzenia.

Jeśli możesz zaprojektować urządzenie, powinieneś stworzyć go kompatybilny z DCAM lub UVC. W obu są wbudowane sterowniki dostarczane przez okna.


Jak napisać urządzenia źródłowego oprogramowania:

Musisz utworzyć filtr DirectShow, który dostarcza co najmniej jeden pin wyjściowy i zarejestrować ten pod VideoInputCategory. Może być kilka interfejsów, których niektóre aplikacje wymagają od aplikacji przechwytującej, ale te zależą od samej aplikacji. Proste aplikacje do wypróbowania filtrów to GraphEdit i AMCap, które są dostarczane w zestawie SDK Plattform.

Niektóre kodu:

#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 GUID jest stworzony dla tego wpisu '' wirtualnego urządzenia.

+1

powiązany artykuł na ten temat z C# http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in –

Powiązane problemy