如何更改 DirectShow 推送源过滤器出现在哪个组和子组中?

How can I change what group and sub-group a DirectShow push source filter appears in?

我正在使用以下开源文章中的代码创建一个 C# DirectShow 推送源过滤器,它构建了一个名为 VirtualCam:

的过滤器

http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in

GraphEdit 实用程序可以找到它并将其显示在名为 CSharp Virtual 的 Video Capture Sources 组中相机,我可以用它构建一个滤镜图,它工作正常。 Skype 也可以找到它。但是,我想使用它的所有其他软件都找不到它,因为当使用 VideoInputSource 作为主要组时,它不会出现在设备枚举调用中。我相信这是该组的 class ID:

/// <summary> CLSID_VideoInputDeviceCategory, video capture category </summary>
public static readonly Guid VideoInputDevice = new Guid(0x860BB310, 0x5D01, 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);

我从扫描视频输入设备的开源实用程序中获得了 class ID。它也是找不到 VirtualCam 滤镜的应用程序之一。这些应用程序只能找到像我的网络摄像头这样的设备(换句话说,VirtualCam 不会 显示在可用设备列表中)。

我需要对 VirtualCam 源代码做些什么才能使其 declares/registers 本身作为视频输入设备并显示在设备枚举扫描中VideoInputDevice 类别以便大多数软件都能看到并使用它?

UPDATE:在 GraphEdit 中仔细检查后,我发现 VirtualCam 之间的主要区别大多数应用程序无法找到的过滤器,可以找到的视频捕获设备是 VirtualCam 过滤器 没有定义任何引脚,而其他视频捕获设备有。如果这是问题所在,我应该如何正确定义一个引脚,以允许 VirtualCam 被发现并正常工作以服务声明的接口?

没有分组,分组简称为"category"。过滤器被注册到类别中。您感兴趣的类别是 CLSID_VideoInputDeviceCategory 也称为 "Video Capture Sources"。

从注册的角度来看,我唯一能想到的问题是 32/64 位。注册为 32 位过滤器的过滤器对 64 位应用程序不可见,反之亦然。这可能很棘手,因为您的项目是 C# 并且您可能已经为 AnyCPU 构建了它,但是在任何情况下您都可以使用 32 位和 64 位 GraphEdit(或者更确切地说 GraphStudioNext)来确保您的过滤器在列表中。出现在过滤器列表中可确保注册步骤已通过。

从那时起,取决于应用程序的实施,显示或不显示特定的视频源。一些应用程序显示每个注册的源,其他像 Skype 试图实例化源并做一些初始检查。如果他们不喜欢该来源,则会将其从选择列表中删除。

视频源的实现要求没有明确定义,但大多数应用程序希望获得与 WDM Video Capture Filter. Better applications accept video source if SDK AmCap sample 兼容的过滤器可以预览它,更糟糕的实现有其他假设。

一般来说,视频源必须在过滤器 class 中实现 IBaseFilter,在引脚中实现 IPinIAMStreamConfig 接口。它也应该在引脚中实现 IQualityControlIKsPropertySet。实现 ISpecifyPropertyPages 也很好,因为糟糕的实现也可能期望它在那里(即使没有附加页面)。