DirectShow:如何更改filter属性?

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

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

问题1 :如何在代码中更改DirectShowfilter的属性?

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

问题2 :如何获取图表中其他filter的引用,以便更改其属性?

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

编辑 :我找到了一种通过EnumFilters枚举来获取对这些filter的引用的方法。 然后我在每个filter上使用QueryFilterInfo来查找它的名称。 这与使用FindFilterByName不同,因为我现在可以使用Contains来查找某些单词(如“Crossbar”)。 但是,我已经有一个横杆filter命名的例子(“… Xbar”),所以我仍然在寻找一种更通用的方法来做到这一点。 我希望我能按他们的类别找到filter……

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

解决方案 :查看已接受的答案评论。 我需要将需要更改属性的filter转换为各自的接口。 例如,需要将交叉开关filter连接到IAMCrossbar接口 。 通过此界面,我现在可以更改所有与横杆相关的属性。

2 – EnumFilters是正确的方法。 您不应该信任名称,因为它们仅仅是为了使开发人员友好,能够轻松区分图中的filter,但它们不承诺全局持久且一致。 这同样适用于引脚名称。

1 – 在本机API中,您可以使用OleCreatePropertyFrame函数创建具有属性页的UI。 另请参见在此处显示filter的属性页 。

我不认为DirectShow.NET有一个包装器,所以你需要通过P / Invoke这样调用这个API: C#:如何使用directshow.net来显示这个对话框?

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

2 – 您是否尝试过查看filterIMoniker提供的DeviceName? 我个人发现它对黑名单filter非常有用,似乎你可以通过它的IMoniker :: DeviceName来讲述一下设备类型。 我不确定它是否足以满足您的需求,但它可能是一个开始。

对于问题一,要“找到”自动插入的横杆filter,使用ICaptureGraphBuilder2 :: FindInterface然后你可以显示其本机属性页面“gui popup”(参见Roman的答案)并允许用户使用它来控制它,或者使用正常crossbar枚举/选择API以编程方式执行。