虚拟网络摄像头驱动程序(Virtual Webcam Driver)

2019-09-01 08:52发布

我想开发它从用户模式我会通过图像给它一个虚拟摄像头驱动程序,它会显示为摄像头输出。

我不想使用DirectX过滤器和CSourceStream等因为不上的某些程序不使用DirectX捕捉摄像头的形象工作。

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

有任何想法吗? 我从DDK样品试testcap,但它从用户模式不处理图像,并没有得到任何输入,只需将其显示在摄像头7种颜色...

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


谢谢你们!

我试图代码从这里: http://tmhare.mvps.org/downloads.htm (发现捕捉源过滤器)

它运作良好,当我在雅虎,MSN编译它,但它坠毁AIM,IE浏览器的Flash网络摄像头,火狐的Flash网络摄像头和Skype ...我的QueryInterface了崩溃后8时调用的是,我发现它与一个跟踪它很多花样..

现在我知道,它崩溃上HRESULT CVCamStream :: 8日的QueryInterface调用(REFIID RIID,无效** PPV)

当到达持续,如果8日呼吁,我的意思是:回报CSourceStream ::的QueryInterface(RIID,PPV);

这是一个在Filters.cpp的第17行

为什么你觉得我越来越崩溃?

谢谢大家指导我找到正确的解决方案,它是DirectShow的,不是司机

Answer 1:

有来自微软多个API,其提供对图像数据。

  • 吐温:用于从扫描仪等单图像采集
  • WIA:这似乎已经退化成一个单一的图像编解码器库。
  • VfW的:一个很旧的(Win16的)API,它真的只适用视频文件编码/解码,但已经有一段视频采集支持。
  • DirectShow的:以前在DirectX SDK的一部分,目前在平台SDK。 这是去电流(一般)流媒体解决方案的地方。
  • Windows媒体/媒体基金会:这似乎更在视频播放/重新编码来为目标。
  • 制造商特定的库:塔/哈尔康/成像控制/ ...

DirectShow的具体:

创建窗口下的图像采集设备,则必须提供一个任一装置(驱动程序),其实现了streamclasses接口(或较新的AV流),或已写入必须被添加到该VideoInputCategory枚举一个用户模式COM对象。

该AV流样品提供一切为了真实图像采集设备。 只有在实际设备下层真的丢失。

如果你可以设计一个装置,您应该创建DCAM或UVC兼容。 对于这两种有内置由Windows提供的驱动程序。


如何写一个软件源设备:

你必须创建一个DirectShow过滤器,其提供至少一个输出引脚和VideoInputCategory下注册此。 可能有几个接口,某些应用程序捕获应用需要,但这些依赖于应用程序本身。 简单的应用程序来尝试过滤器的GraphEdit和AMCAP这是在Plattform SDK提供的。

一些代码:

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



Answer 2:

你不能决定其他节目怎么会叫你的驱动程序。 大多数的程序会使用DirectShow的。 有些人会使用WIN3.X技术VFW。 许多新的方案,其中包括Windows XP的扫描仪和照相机向导,可通过WIA接口给你打电话。 如果你不想要实现这一切,你需要至少提供的DirectShow接口通过WDM,让vfwwdm32.dll给你一个VFW界面,或者自己写VFW驱动程序。



文章来源: Virtual Webcam Driver