我正在开发一款帮助用户配置电视调谐卡的应用程序。基本上用户选择设备,应用程序生成graph file (.GRF)作为输出。但是,用户应该能够更改一些设置。这些设置包括视频标准(PAL,NTSC,SECAM),视频输入(调谐器,复合视频,SVideo)等。
在GraphEdit中,可以通过右键单击所需的过滤器,然后选择“过滤器属性...”来完成。但是,我不知道如何在代码中实现相同的目标。
问题1 :如何在代码中更改DirectShow过滤器的属性?
因为我使用ICaptureGraphBuilder2::RenderStream来构建我的图形,所以我只保留对源过滤器和渲染器的引用。我希望能够更改的大多数属性都可以在其他过滤器上找到,例如crossbar过滤器,它是由RenderStream方法自动添加的。
问题2 :如何获取图表中其他过滤器的引用,以便更改其属性?
注意:我不会使用FindFilterByName因为我的应用程序应该与大多数电视调谐卡一起使用,并且每张卡都可以用作不同的名称。
修改:我找到了一种通过枚举EnumFilters获取对这些过滤器的引用的方法。然后我在每个过滤器上使用QueryFilterInfo来查找它的名称。这与使用FindFilterByName不同,因为我现在可以使用Contains来查找某些单词(例如“Crossbar”)。但是,我已经有一个横杆过滤器命名的例子(“... Xbar”),所以我仍然在寻找一种更通用的方法来做到这一点。我希望我能找到category ...
的过滤器顺便说一句,我目前正在使用DirectShow.Net library,但我相信这种方法应该与C ++库相同。但是,我并不完全理解C ++语法,所以 if 你打算发布(引用)一个代码示例,如果是C#或VB.NET,那将是一个很大的帮助。
解决方案:查看已接受的答案评论。我需要将需要更改属性的过滤器转换为各自的接口。例如,需要将交叉开关过滤器转换为IAMCrossbar interface。通过此界面,我现在可以更改所有与横杆相关的属性。
答案 0 :(得分:3)
2 - EnumFilters
是正确的做法。您不应该信任名称,因为它们仅仅是为了使开发人员友好,能够轻松区分图中的过滤器,但它们不承诺全局持久且一致。这同样适用于引脚名称。
1 - 在本机API中,您可以使用具有OleCreatePropertyFrame
功能的属性页创建UI。另请参阅Displaying a Filter's Property Pages。
我不认为DirectShow.NET有一个包装器,所以你需要通过P / Invoke这样调用这个API:C# : How to use directshow.net to show this dialog?
设置是特定于过滤器的,通常通过专用接口公开,因此没有统一的访问权限。但是,如果过滤器支持从/保存到流中,则可以以统一的方式一次保存/恢复设置。 GraphEdit使用.GRF文件保存/加载的方式。
答案 1 :(得分:0)
2 - 您是否尝试过查看过滤器IMoniker提供的DeviceName?我个人觉得它对黑名单过滤器非常有用,似乎你可以通过它的IMoniker :: DeviceName来讲述一下设备类型。 我不确定它是否足以满足您的需求,但它可能是一个开始。
答案 2 :(得分:0)
问题一,发现"发现"自动插入交叉开关过滤器,使用ICaptureGraphBuilder2 :: FindInterface然后你可以显示它的本机属性页面" gui popup" (参见Roman的回答)并允许用户使用它来控制它,或者使用普通的crossbar enumerate / select API以编程方式进行控制。