我正在开发一个帮助用户配置他们的电视调谐器卡的应用程序。基本上,用户选择一个设备,应用程序生成一个图形文件 (.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 接口。有了这个界面,我现在可以更改所有与交叉开关相关的属性。