我想开发它从用户模式我会通过图像给它一个虚拟摄像头驱动程序,它会显示为摄像头输出。
我不想使用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的,不是司机
有来自微软多个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。
你不能决定其他节目怎么会叫你的驱动程序。 大多数的程序会使用DirectShow的。 有些人会使用WIN3.X技术VFW。 许多新的方案,其中包括Windows XP的扫描仪和照相机向导,可通过WIA接口给你打电话。 如果你不想要实现这一切,你需要至少提供的DirectShow接口通过WDM,让vfwwdm32.dll给你一个VFW界面,或者自己写VFW驱动程序。