我有一个使用 DSPACK 组件库用 Delphi 6 编写的 DirectShow Transform 过滤器。它是一个简单的音频混音器,每当尝试新连接时,它都会创建一个新的输入引脚。我说很简单,因为一旦设置了它的媒体格式,所有到它的输入引脚或单个输出引脚的连接都被迫符合该媒体格式。我手动构建过滤器链,我自己明确地进行所有引脚连接。我不使用任何“智能渲染”调用,除非有某种方法可以意外触发这种不需要的行为(在我的情况下)。
注意:捕获过滤器是我的应用程序外部的标准 DirectShow 过滤器。我的推送源音频过滤器和简单的混音器过滤器被用作私有的、未注册的过滤器,并且在我的应用程序内部。
我遇到了一个奇怪的问题,只有当我尝试与我的混音器建立多个输入连接时才会出现这种问题,它确实接受了它们。目前,我正在尝试将捕获过滤器和我的自定义推送源音频过滤器连接到我的混音器过滤器。每当我尝试这样做时,第二个上游过滤器连接都会失败。无论我是先连接捕获过滤器还是先推送源音频过滤器,第二个上游过滤器连接总是失败。
我运行的第一个测试是尝试仅将 Capture Filter 连接到混音器。那工作得很好。
我运行的第二个测试是尝试仅将 Push Source 音频过滤器连接到混音器。那工作得很好。
但是,一旦尝试同时执行这两项操作,我就会收到“找不到中间过滤器的组合”错误。我做了几个小时的深入挖掘媒体协商调用,从图形生成器点击我的过滤器,然后我发现了问题。出于某种原因,过滤器图正在将古老的“ Indeo (R) Audio Software ”编解码器拖入链中。
我发现了这一点,因为尽管编解码器确实有一个媒体格式在几乎所有方面(主要类型、子类型、格式类型、波形格式参数)都与我的过滤器匹配,但它在 pbFormat 数据的末尾有一个额外的 2 个字节成员,这足以让equals失败测试,因为该测试通过比较每种媒体类型的 cbFormat 值来比较源和目标 pbFormat 区域。Indeo 编解码器的 cbFormat 值为 20,而我的过滤器的 cbFormat 值为 18,这是 _tWAVEFORMATEX 数据结构的大小。在某种程度上,Indeo pbFormat 具有这种奇怪的大小是一件好事,因为它的 20 字节区域的前 18 个字节正好等于我的混音器过滤器支持的媒体类型的 pbFormat 区域。如果没有这种异常,我永远不会知道古代编解码器正在被吸毒。我很惊讶它完全被吸毒了,因为它已经知道了漏洞利用和漏洞。最令人困惑的是,这发生在我的混频器滤波器的输出引脚上,而不是输入引脚之一,并且在建立我的引脚连接时,我还没有建立一个下游连接。
谁能告诉我为什么 DirectShow 试图拖入该编解码器,尽管事实上两个传入过滤器、捕获过滤器和推送源过滤器的媒体格式是相同的,并且根本不需要任何中间过滤器,因为它们匹配我的混音器过滤器的输入引脚完全支持格式吗?我该如何解决这个问题?
另外,我注意到即使在上面的单个过滤器附件测试中成功,我的混音器输出引脚仍然被查询媒体格式。为什么正如我所说,在建立我的引脚连接时,我没有将任何东西连接到混频器滤波器的输出引脚?
--------------------------------------- 更新:1 -------- --------
我了解到您可以通过使用 IFilterGraph.ConnectDirect() 而不是 IGraphBuilder.Connect() 完全避免“智能连接”行为。我切换到 DirectConnect(),结果我的混音器过滤器上的输入引脚返回为“已连接”。这可能是导致图形生成器拖入 Indeo 编解码器过滤器的原因。现在我有了这个新的诊断信息,我将更正问题并用我的结果更新这篇文章。