2

我正在开发一个帮助用户配置他们的电视调谐器卡的应用程序。基本上,用户选择一个设备,应用程序生成一个图形文件 (.GRF)作为输出。但是,用户应该能够更改一些设置。这些设置包括视频标准(PAL、NTSC、SECAM)、视频输入(Tuner、Composite、SVideo)等。

在 GraphEdit 中,这可以通过右键单击所需的过滤器来完成,然后选择“过滤器属性...”。但是,我不知道如何在代码中实现相同的目标。

问题 1:如何在代码中更改 DirectShow 过滤器的属性?

因为我使用ICaptureGraphBuilder2::RenderStream来构建我的图表,所以我只持有对源过滤器和渲染器的引用。我希望能够更改的大多数属性都可以在其他过滤器上找到,例如交叉条过滤器,它是由 RenderStream 方法自动添加的。

问题 2:如何获取对图表中其他过滤器的引用,以便更改它们的属性?

注意:我不会使用FindFilterByName,因为我的应用程序应该与大多数电视调谐器卡一起使用,并且每张卡都具有不同的名称。

编辑:我找到了一种通过枚举EnumFilters来获取对这些过滤器的引用的方法。然后我在每个过滤器上使用QueryFilterInfo来查找它的名称。这与使用 FindFilterByName 不同,因为我现在可以使用Contains来查找某些单词(例如“Crossbar”)。但是,我已经有一个名为 crossbar 过滤器的示例(“... Xbar”),因此我仍在寻找一种更通用的方法来执行此操作。我希望我能按类别找到过滤器...

顺便说一句,我目前正在使用DirectShow.Net 库,但我相信该方法应该与 C++ 库相同。但是,我并不完全理解 C++ 语法,因此如果您打算发布(参考)代码示例,那么如果它是在 C# 或 VB.NET 中将有很大帮助。

解决方案:查看接受的答案评论。我需要将过滤器的哪些属性需要更改为它们各自的接口。例如,crossbar 过滤器需要强制转换为IAMCrossbar 接口。有了这个界面,我现在可以更改所有与交叉开关相关的属性。

4

3 回答 3

4

2 -EnumFilters是正确的方法。您不应该信任名称,因为它们只是为了对开发人员友好,以便能够轻松地区分图中的过滤器,但不能保证它们是全局持久性和一致的。这同样适用于引脚名称。

1 - 在本机 API 中,您创建带有OleCreatePropertyFrame功能的属性页的 UI。另请参阅显示过滤器的属性页

我不认为 DirectShow.NET 有一个包装器,所以你需要像这样通过 P/Invoke 调用这个 API:C# : How to use directshow.net to show this dialog?

设置是特定于过滤器的,通常通过私有接口公开,因此没有统一的访问权限。尽管如此,如果过滤器支持从流中加载/保存到流中,您可以以统一的方式一次保存/恢复设置。GraphEdit 使用 .GRF 文件保存/加载的方式。

于 2012-11-14T09:54:51.640 回答
0

2 - 您是否尝试过查看过滤器 IMoniker 提供的设备名称?我个人发现它对于将过滤器列入黑名单非常有用,而且您似乎可以通过其 IMoniker::DeviceName 了解设备类型。我不确定它是否足以满足您的需求,但这可能是一个开始。

于 2013-02-14T13:36:03.023 回答
0

对于问题一,要“查找”自动插入的横杆过滤器,请使用 ICaptureGraphBuilder2::FindInterface 然后您可以显示其本机属性页面“gui popup”(请参阅​​ Roman 的答案)并允许用户使用它来控制它,或者使用普通crossbar 枚举/选择 API 以编程方式进行。

于 2015-04-14T13:22:33.913 回答