Microsoft 有几个 API 提供对图像数据的访问。
- Twain:用于从扫描仪等中捕获单个图像。
- WIA:这似乎已经退化为一个单一的图像编解码器库。
- VfW:一个非常古老的(Win16)API,它只适用于视频文件编码/解码,但支持一些视频采集。
- DirectShow:以前属于 DirectX SDK,目前属于 Platform SDK。这是寻找当前(通用)流媒体解决方案的地方。
- Windows Media/Media Foundation:这似乎更适合视频播放/重新编码。
- 制造商特定库:Pylon/Halcon/Imaging Control/...
DirectShow 具体:
要在 Windows 下创建图像采集设备,您必须提供一个设备(驱动程序)来实现流类接口(或更新的 Avstream),或者您必须编写一个必须添加到 VideoInputCategory 枚举器的用户模式 COM 对象。
Avstream 示例为真实的图像采集设备提供了一切。只有实际设备的底层确实丢失了。
如果您可以设计设备,则应创建与 DCAM 或 UVC 兼容的设备。两者都有 Windows 提供的内置驱动程序。
如何编写软件源设备:
您必须创建一个 DirectShow 过滤器,它至少提供一个输出引脚并将其注册到 VideoInputCategory 下。某些应用程序可能需要来自捕获应用程序的多个接口,但这些接口取决于应用程序本身。用于试用过滤器的简单应用程序是 Platform 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。