关于DirectShow源筛选器

About DirectShow source filter

提问人:LUN2 提问时间:6/10/2022 最后编辑:Roman R.LUN2 更新时间:6/10/2022 访问量:140

问:

我创建了(C++、Win10、VS2022)一个简单的源DirectShow过滤器。它从外部源(文件-用于测试,网络-将来)获取音频流,并在输出引脚上生成音频流,我将其连接到Soundspeaker。

为此,我为过滤器的输出引脚 (CSourceStream) 实现了 FillBuffer 方法。介质类型 - MEDIATYPE_Stream/MEDIASUBTYPE_PCM。 在连接之前,引脚通过 SetMediaType (WAVEFORMATEX) 获取有关媒体类型的信息,并记住音频的参数 - wBitsPerSample;nSamplesPerSec;n通道。音频流从外部源(文件或网络)发送到 FillBuffer,参数为 - wBitsPerSample;nSamplesPerSec;n通道。它工作正常。

但是我需要处理情况,当外部源将音频流发送到滤波器时,使用另一个参数(例如,旧样本有 11025 Hz,电流 = 22050)。

你能帮我吗 - 如果我将接收带有更改的 wBitsPerSample 或 nSamplesPerSec 或 nChannels 参数的音频流,我应该在 FillBuffer() 方法中进行哪些操作和调用?

事实是,这些参数已经在我的输出引脚和扬声器的输入引脚之间达成一致,我需要正确更改这些协议。

音频 DirectShow

评论


答:

0赞 Roman R. 6/10/2022 #1

您需要改进实施和处理

动态格式更改

...

QueryAccept(Downstream) 在以下情况下使用:如果输出引脚建议对其下游对等体进行格式更改,但前提是新格式不需要更大的缓冲区。

这可能并非微不足道,因为基线DirectShow筛选器不需要支持动态更改。也就是说,更改格式的能力取决于实际管道和其他筛选器的实现。

您还应该能够找到 SDK 帮助程序,以及 .CDynamicSourceStreamCDynamicSource

评论

0赞 LUN2 6/11/2022
罗曼,谢谢你的建议。我会学习提到的材料。
0赞 LUN2 6/11/2022
罗曼,谢谢你的建议。我会学习提到的材料。另一个问题是 - 当 FillBuffer() 知道必须更改格式时,它可以返回 S_FALSE(流结束)。我的问题是 - 在这种情况下图形状态发生了什么?它将被停止,我可以捕捉到关于它的图形消息吗?因此,在检测到这种情况后,主程序可以开始重新连接...有可能的方法吗?(该图由 2 个过滤器组成 - 我的过滤器和音频渲染器(扬声器)。
0赞 Roman R. 6/11/2022
流结束通知无法实现动态格式更改。因此,按照上面链接的文章,您必须首先“在下游引脚上调用 IPin::QueryAccept 或 IPinConnection::D ynamicQueryAccept,以验证另一个引脚是否可以接受新的媒体类型(请参阅插图,步骤 A)”,然后“...然后,它调用将媒体类型附加到该示例 (C)。当您的样品准备就绪时,它将附加一个新的介质类型,并且已确认此介质类型的接收引脚将看到更改已完成。FillBufferIMediaSample::SetMediaType
0赞 LUN2 6/11/2022
Roman,关于“流结束通知对动态格式更改是无法实现的......” - 我已经理解了,并将尝试这种方法。在我的上一条评论中,我想到了另一种方法 - 通过流结束通知强制过滤器停止,然后在 FillBuffer 之外重新连接过滤器。
0赞 Roman R. 6/11/2022
问题是,不支持动态重新连接的老式过滤器不能仅仅因为EOS而改变媒体类型,需要完全过渡到停止状态。能够动态重新连接的较新过滤器不需要 EOS,因为它们可以立即更改媒体类型。停止的问题是滑动的平滑度,它不会准确平滑,如果您对此感到满意,那么通过停止的新媒体类型显然是一个更容易的解决方案。