0

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

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

GraphEdit实用程序可以找到它并将其显示在名为 CSharp Virtual Camera 的Video Capture Sources组中,我可以用它构建一个过滤器图,它工作正常。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并正常工作以服务声明的接口的引脚?

4

1 回答 1

2

没有子组,组被称为“类别”。过滤器被注册到类别中。您在这里感兴趣的类别CLSID_VideoInputDeviceCategory也称为“视频捕获源”。

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

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

视频源的实现要求没有明确定义,但大多数应用程序都希望获得与WDM Video Capture Filter. 如果 SDK AmCap 示例可以预览视频源,则更好的应用程序接受视频源,更差的实现有其他假设。

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

于 2015-07-24T05:29:07.710 回答