有来自微软多个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。
你的意思是WDK而不是DDK,对不对?另外,为了更好地了解你要找的东西,样本中的testcap的位置,我找不到它。 – mrduclaw 2009-10-26 21:51:50
再次。 不要试图写驱动程序,因为驱动程序往往非常大。 我会尝试查看我的代码以注册软件设备,并在此处显示它。 – Christopher 2009-10-26 22:06:49
如果你真的必须去Windows驱动程序的方式...请参阅[这个问题](http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service)了解如何与设备驱动程序进行通信。祝你好运。 – Christopher 2009-10-27 11:30:48