2009-10-26 44 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