我正在使用该代码从以下开源文章创建C#DirectShow推送源过滤器,该文章构建了一个名为 VirtualCam 的过滤器:
http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in
GraphEdit 实用程序可以找到它并在名为 CSharp虚拟摄像头的视频捕获源组中显示它,我可以构建带有它的过滤器图形和它可以正常工作。 Skype也可以找到它。但是,我想要使用的所有其他软件都找不到它,因为当使用 VideoInputSource 作为主要组时,它不会显示在设备枚举调用中。我相信这是该组的类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);
我从一个扫描视频输入设备的开源实用程序中获取了该类ID。这是其中一个无法找到 VirtualCam 过滤器的应用。这些应用程序只能找到像我的网络摄像头这样的设备(换句话说,VirtualCam 不显示在可用的设备列表中)。
我需要对 VirtualCam 源代码做什么,以便它声明/将自身注册为视频输入设备,并将显示在 VideoInputDevice中的设备枚举扫描中类别所以大多数软件都可以看到并使用它?
更新:仔细检查 GraphEdit 后,我发现大多数应用无法找到的 VirtualCam 过滤器之间的主要区别可以找到的视频捕获设备是 VirtualCam 过滤器没有定义任何引脚,而其他视频捕获设备可以。如果这是问题,我应该如何正确定义一个引脚,以便发现 VirtualCam 并正确地为所声明的接口提供服务?
答案 0 :(得分:2)
没有子组,该组被称为“类别”。过滤器已注册到类别中。您感兴趣的类别是CLSID_VideoInputDeviceCategory
,也称为“视频捕获源”。
从注册的角度来看,我能想到的唯一问题是32/64位。注册为32位过滤器的过滤器对64位应用程序不可见,反之亦然。这可能很棘手,因为您的项目是C#而您可能已为AnyCPU
构建它,但无论如何您可以使用32位和64位GraphEdit(或更确切地说GraphStudioNext)来确保您的过滤器在列表中。过滤器列表中的状态确保注册步骤已通过。
从那时起,应用程序的实现可以显示或不显示特定的视频源。某些应用程序显示每个注册的源,其他像Skype尝试实例化源并进行一些初始检查。如果他们不喜欢源,则将其从选项列表中删除。
视频源的实现要求没有明确定义,但大多数应用程序希望获得与WDM Video Capture Filter
兼容的过滤器。如果SDK AmCap sample可以预览它,更好的应用程序接受视频源,更糟糕的实现有其他假设。
通常,视频源必须在过滤器类中实现IBaseFilter
,并在引脚中实现IPin
,IAMStreamConfig
接口。它也应该在引脚中实现IQualityControl
和IKsPropertySet
。实现ISpecifyPropertyPages
也很好,因为糟糕的实现也可能期望它(即使没有附加页面)。