动态创建多个DirectShow虚拟网络摄像机设备



我正在尝试使用多个虚拟设备创建一个虚拟网络摄像头DirectShow筛选器。

摄像机的定义如下:

CFactoryTemplate g_Templates[] =
{
{
SUB_DEVICE_NAME_0,
&CLSID_VirtualCam_0,
CVCam::CreateInstance0,
NULL,
&AMSFilterVCam_0
},
{
SUB_DEVICE_NAME_1,
&CLSID_VirtualCam_1,
CVCam::CreateInstance1,
NULL,
&AMSFilterVCam_1
}
};

初始化使用以下static方法完成:

CUnknown * WINAPI CVCam::CreateInstance0(LPUNKNOWN lpunk, HRESULT *phr)
{
return new CVCam(NAME(DEVICE_NAME_0), lpunk, phr, CLSID_VirtualCam_0, 0);
}
CUnknown * WINAPI CVCam::CreateInstance1(LPUNKNOWN lpunk, HRESULT *phr)
{
return new CVCam(NAME(DEVICE_NAME_1), lpunk, phr, CLSID_VirtualCam_1, 1);
}

有没有可能更动态地这样做,这样我们就不必对每个相机进行硬编码,而是可以在运行时传递参数?

问候,

可以动态添加和移除相机。然而,这与你在问题正文中所想的完全不同。DirectShow基类为您提供了将静态声明转换为注册的某些帮助程序,DirectShow示例代码显示了DLL导出如何连接到这些帮助程序以满足注册需要。

为了使其动态化,您需要扩展AMoveDllRegisterServer2为大多数过滤器项目所做的工作,并根据您的需要调整其实现。

RegisterFilters的这一部分可能是一个很好的起点,您可能希望使它成为一个循环或其他东西。您将不得不分别处理额外的fm->RegisterFilter(...调用,这些调用指向您想要的额外虚拟相机。

最新更新