2009-10-26 172 views
17

我想開發它從用戶模式我會通過圖像給它一個虛擬攝像頭驅動程序,它會顯示爲攝像頭輸出。虛擬網絡攝像頭驅動程序

我不想使用DirectX過濾器和CSourceStream等因爲不上的某些程序不使用DirectX捕捉攝像頭的形象工作。

我必須寫一個內核模式設備驅動程序,以便。

任何想法?我從DDK樣品試testcap,但它從用戶模式不處理圖像,並沒有得到任何輸入,只需將其顯示在攝像頭7種顏色...

任何幫助將不勝感激。 謝謝


謝謝大家!

我試圖代碼從這裏: http://tmhare.mvps.org/downloads.htm(發現捕獲的Source Filter)

它運作良好,當我在雅虎,MSN編譯它,但它墜毀AIM,IE瀏覽器的Flash網絡攝像頭,火狐的Flash攝像頭和Skype。 ..我在QueryInterface 8次調用後崩潰了,我發現它跟蹤它的很多技巧..

現在我知道,它崩潰在第8個電話 HRESULT CVCamStream :: QueryInterface(REFIID riid ,無效** PPV)​​

當它達到

8通話最後如果,我的意思是: return CSourceStream :: QueryInterface(riid,ppv);

它在Filters.cpp

爲什麼你覺得我越來越崩潰的第17行?

謝謝大家指導我找到正確的解決方案,它是DirectShow的,不是司機

+0

你的意思是WDK而不是DDK,對不對?另外,爲了更好地瞭解你要找的東西,樣本中的testcap的位置,我找不到它。 – mrduclaw 2009-10-26 21:51:50

+0

再次。 不要試圖寫驅動程序,因爲驅動程序往往非常大。 我會嘗試查看我的代碼以註冊軟件設備,並在此處顯示它。 – Christopher 2009-10-26 22:06:49

+0

如果你真的必須去Windows驅動程序的方式...請參閱[這個問題](http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service)瞭解如何與設備驅動程序進行通信。祝你好運。 – Christopher 2009-10-27 11:30:48

回答

4

你不能決定其他節目怎麼會叫你的驅動程序。大多數程序將使用DirectShow。有些人會使用win3.x技術VFW。許多新的程序,包括Windows XP的掃描儀和照相機嚮導,都可以通過WIA界面打電話給您。如果你不想實現所有這些,你需要通過WDM at least provide the DirectShow interface,讓vfwwdm32.dll爲你提供一個VFW接口,或者編寫你自己的VFW驅動程序。

16

有來自微軟多個API,其提供對圖像數據。

  • 吐溫:用於從單一的掃描儀圖像採集等
  • WIA:這似乎已經退化成一個單一的圖像編解碼器庫。 VfW:一個非常老的(Win16)API,它只能實現視頻文件編碼/解碼,但支持某些視頻採集。
  • DirectShow:以前是DirectX SDK的一部分,目前在Platform SDK中。這是當前(通用)流媒體解決方案的地方。 Windows Media/Media Foundation:這看起來更像是針對視頻播放/重新編碼。
  • 製造商特定庫:Pylon/Halcon /成像控制/ ...

DirectShow的具體:

要創建的窗口下的圖像採集設備,則必須提供任一的裝置(驅動程序),其實現了streamclasses接口(或較新的AV流),或者你必須寫一個用戶模式COM對象必須將其添加到VideoInputCategory枚舉器。

Avstream示例爲實際圖像採集設備提供了所有功能。只有實際設備的較低層確實缺失。

如果您可以設計一個設備,您應該創建它與DCAM或UVC兼容。對於這兩個都有由Windows提供的內置驅動程序。


如何編寫軟件源設備:

你必須創建一個DirectShow過濾器,其提供至少一個輸出引腳和VideoInputCategory下注冊此。某些應用程序可能需要捕捉應用程序需要幾個接口,但這些接口取決於應用程序本身。試用過濾器的簡單應用程序是在Plattform SDK中提供的GraphEdit和AMCap。

某些代碼:

#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。

+1

在C#中做這件事的相關文章http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in – 2015-02-06 04:34:43