1

我正在尝试使用多个虚拟设备创建一个虚拟网络摄像头 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);
}

是否可以更动态地执行此操作,以便我们不必对每个相机进行硬编码,但可以在运行时传递参数?

问候,

4

1 回答 1

1

可以动态添加和删除相机。但是,它与您在问题正文中的想法完全不同。DirectShow BaseClasses 为您提供了某些帮助器来将静态声明转换为注册,并且 DirectShow 示例代码显示了 DLL 导出如何连接到这些帮助器以满足注册需求

要使其动态化,您需要扩展AMoveDllRegisterServer2大多数过滤器项目的功能并根据您的需要调整其实现。

这部分RegisterFilters可能是一个很好的起点,您可能希望将其设为循环或其他内容。您将不得不fm->RegisterFilter(...分别处理对您想要的其他虚拟摄像机的额外调用。

于 2022-01-19T12:37:17.887 回答