虚拟摄像头驱动程序

我想开发一个虚拟的网络摄像头驱动程序,从用户模式我会传递图像到它,它会显示为摄像头输出。

我不想使用DirectX过滤器和CSourceStream等,因为它们不适用于某些不使用DirectX捕捉网络摄像头图像的程序。

我必须编写一个内核模式设备驱动程序。

有任何想法吗? 我尝试了DDK示例中的testcap,但它不处理来自用户模式的图像,并且没有得到任何输入,只是它在网络摄像机中显示7种颜色...

任何帮助将不胜感激。 谢谢


谢谢你们!

我尝试从这里的代码:http://tmhare.mvps.org/downloads.htm(找到捕获源过滤器)

它在Yahoo,MSN编译时运行良好,但它崩溃了AIM,Internet Explorer Flash网络摄像头,Firefox Flash网络摄像头和Skype ...我在8次调用QueryInterface后崩溃,我发现它跟踪很多技巧..

现在我知道,它在第8次调用HRESULT CVCamStream :: QueryInterface(REFIID riid,void ** ppv)时崩溃了,

第8次调用时,它到达最后如果,我的意思是:返回CSourceStream :: QueryInterface(riid,ppv);

它在Filters.cpp的第17行

你为什么觉得我会崩溃?

感谢大家指导我找到DirectShow的正确解决方案,而不是驱动程序


有几个来自微软的API可以访问图像数据。

  • 吐温:用于从扫描仪等单个图像捕获。
  • WIA:这似乎已经退化为单个图像编解码器库。
  • VfW:一个非常老的(Win16)API,它只能实现视频文件编码/解码,但支持一些视频采集。
  • DirectShow:以前是DirectX SDK的一部分,目前在Platform SDK中。 这是当前(通用)流媒体解决方案的地方。
  • Windows媒体/媒体基础:这看起来更像是视频播放/重新编码。
  • 制造商特定库:Pylon / Halcon /成像控制/ ...
  • DirectShow特定:

    要在Windows下创建图像采集设备,您必须提供实现流类接口(或更新的Avstream)的设备(驱动程序),或者必须编写必须添加到VideoInputCategory枚举器的用户模式COM对象。

    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。


    您无法决定其他程序如何称呼您的驱动程序。 大多数程序将使用DirectShow。 有些人会使用win3.x技术VFW。 许多新的程序,包括Windows XP的扫描仪和照相机向导,都可以通过WIA界面打电话给您。 如果你不想实现所有这些,你至少需要通过WDM提供DirectShow接口,并让vfwwdm32.dll为你提供一个VFW接口,或者编写你自己的VFW驱动程序。

    链接地址: http://www.djcxy.com/p/81083.html

    上一篇: Virtual Webcam Driver

    下一篇: FFMPEG Set Webcam Encoder C++