【问题标题】:How can I change what group and sub-group a DirectShow push source filter appears in?如何更改 DirectShow 推送源过滤器出现在哪个组和子组中?
【发布时间】:2015-07-23 21:35:14
【问题描述】:

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

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

GraphEdit 实用程序可以找到它并将其显示在 Video Capture Sources 组中,名称为 CSharp Virtual Camera,我可以构建一个带有它的过滤器图,效果很好。 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 中的设备枚举扫描中strong> 类别,所以大多数软件都可以看到并使用它?

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

【问题讨论】:

  • 您希望它显示在什么应用程序中。也许这个应用程序使用 MediaFoundation 作为 Videobackend!然后 DirectShow 过滤器不起作用。

标签: c# directx directshow video-codecs


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢。你知道是否有像 SysInternals ProcMon 这样的实用程序可以向我显示应用程序正在进行的所有 DirectShow 调用,以便我可以看到它的预期?
  • 没有这样的工具。你应该检查你在课堂上收到的电话、过滤器和别针(包括QueryInterface),你就能猜到它在哪一点偏离了轨道。
  • 谢谢,会的。我的第一个目标是实现 IPin,因为我刚刚检查了 VirtualCam 代码,据我所知,它没有实现该接口。您对 32/64 位的建议确实有所帮助。我设法通过将过滤器重新编译为 64 位(当然 32 位 GraphEdit 再也看不到它),让过滤器显示在以前不成功的应用程序中。但是,我想要使用 VirtualCam 过滤器的主应用程序仍然没有运气。
  • IBaseFilter, IPin 是第一个实现的接口 - 没有它们,过滤器在任何应用程序中都无法运行;典型的问题是IAMStreamConfig,因为它通常是可选的,但假设它特别存在于视频源中。那么其他应用可能会有其他假设。
  • 这是一个难题,因为它特定于这个“目标应用程序”。如果它将IP Video Source 视为虚拟设备,我将列出它实现的接口,也许这会有所帮助。
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多