Delphi 为什么DirectShow在与我的DirectShow转换过滤器建立多个输入连接时会拖入不必要的中间过滤器?

Delphi 为什么DirectShow在与我的DirectShow转换过滤器建立多个输入连接时会拖入不必要的中间过滤器?,delphi,filter,directshow,dspack,Delphi,Filter,Directshow,Dspack,我有一个使用DSPACK组件库用Delphi6编写的DirectShow转换过滤器。它是一个简单的音频混音器,在尝试新连接时创建一个新的输入引脚。我之所以说简单,是因为一旦设置了媒体格式,其输入引脚或单个输出引脚的所有连接都必须符合该媒体格式。我手动构建过滤器链,自己显式地创建所有管脚连接。我不使用任何“智能渲染”调用,除非有某种方法意外触发不需要的行为(在我的例子中) 注意:捕获筛选器是我的应用程序外部的标准DirectShow筛选器。我的推送源音频过滤器和简单音频混音器过滤器被用作私有的、未

我有一个使用DSPACK组件库用Delphi6编写的DirectShow转换过滤器。它是一个简单的音频混音器,在尝试新连接时创建一个新的输入引脚。我之所以说简单,是因为一旦设置了媒体格式,其输入引脚或单个输出引脚的所有连接都必须符合该媒体格式。我手动构建过滤器链,自己显式地创建所有管脚连接。我不使用任何“智能渲染”调用,除非有某种方法意外触发不需要的行为(在我的例子中)

注意:捕获筛选器是我的应用程序外部的标准DirectShow筛选器。我的推送源音频过滤器和简单音频混音器过滤器被用作私有的、未注册的过滤器,并且是我的应用程序的内部过滤器

我遇到了一个奇怪的问题,只有当我尝试将多个输入连接到我的混音器时才会出现,混音器确实接受它们。目前,我正在尝试将捕获过滤器和自定义推送源音频过滤器连接到混音器过滤器。每当我尝试这样做时,第二个上游过滤器连接就会失败。无论我是先连接捕获过滤器还是先连接推送源音频过滤器,第二个上游过滤器连接总是失败

我运行的第一个测试是尝试仅将捕获过滤器连接到混合器。效果很好

我运行的第二个测试是尝试只将推送源音频过滤器连接到混音器。效果很好

但当我尝试同时做这两件事时,我得到了一个“找不到中间过滤器的组合”错误。我从graph builder中点击了我的过滤器,对媒体协商电话进行了几个小时的深入挖掘,然后我发现了问题所在。出于某种原因,过滤器图形正在将古老的“Indeo(R)音频软件”编解码器拖入链中

我发现这一点是因为,尽管编解码器确实有一种媒体格式,几乎在各个方面都与我的过滤器相匹配(主要类型、子类型、格式类型、波形格式参数),它的pbFormat数据成员末尾有一个额外的2字节,这足以使equals测试失败,因为该测试通过比较每种媒体类型的cbFormat值来比较源和目标pbFormat区域。Indeo编解码器的cbFormat值为20,而my filter的cbFormat值为18,这是一个_tWAVEFORMATEX数据结构的大小。从某种程度上说,Indeo pbFormat有这么大的尺寸是件好事,因为它的20字节区域的前18个字节正好等于我的混音器过滤器支持的媒体类型的pbFormat区域。如果没有这种反常现象,我永远不会知道古代的编码解码器正在被滥用。我很惊讶它竟然是毒品,因为它知道漏洞和漏洞。最令人困惑的是,这发生在我的混音器过滤器的输出管脚上,而不是其中一个输入管脚上,并且在建立管脚连接时,我还没有建立一个下游连接

有人能告诉我为什么DirectShow试图拖入该编解码器,尽管事实上传入过滤器(捕获过滤器和推送源过滤器)的媒体格式是相同的,并且根本不需要任何中间过滤器,因为它们与我的混音器过滤器的输入管脚支持的格式完全匹配?我如何解决这个问题

此外,我注意到,即使在上面成功的单过滤器连接测试中,我的混音器输出pin仍然被查询媒体格式。为什么正如我所说,在建立管脚连接时,我没有将任何东西连接到混音器过滤器的输出管脚

---------------------------更新:1----------------------------

我了解到,使用IFilterGraph.ConnectDirect()而不是IGraphBuilder.Connect()可以完全避免“智能连接”行为。我切换到DirectConnect(),结果发现混音器过滤器上的输入引脚恢复为“已连接”。这可能是导致graph builder在Indeo编解码器过滤器中拖动的原因。现在我有了这个新的诊断信息,我将纠正这个问题并用我的结果更新这篇文章。

-------------------------------解决方案-----------------


所有这些的根本问题是我重复使用了我从第一个目的地/下游过滤器获得的输入管脚,我连接到我的简单音频混音器过滤器,在我的应用程序代码的顶部。换句话说,我的过滤器工作正常,但我没有得到一个新的输入引脚与每个上游过滤器我试图连接到它。一旦我开始这样做,连接过程就运行得很好。我不知道为什么IGraphBuilder.Connect()接口后面的代码试图引入Indeo编解码器过滤器,可能与尝试连接到已连接的输入端有关,但它确实做到了。出于我的需要,我更喜欢IFilterGraph.ConnectDirect()提供的严密控制,因为它消除了IGraphBuilder中智能连接代码的任何干扰,但我可以看到,当涉及视频过滤器时,它可能会变得有用。

由于以下两个原因之一,会拖动不必要的过滤器:(1)待连接过滤器上暴露的不良介质类型,或fitler未能接受定义良好的介质类型,以及(2)过滤器注册不良/损坏,例如具有意外的高价值。所有与精神症状有关的问题都是这样的。很高兴知道@Roman R。你是否找到了一种工具、技术或测试方法来尽快发现和跟踪这些类型的故障?
GraphStudio
DirectShowSpy
-这些是我的工具。当然,这也需要一个aler