我需要将最多16个通道的PCM音频流拆分为几个立体声流。
由于找不到任何能够执行此操作的功能,因此我尝试编写第一个DirectShow过滤器。
任何能够分割音频的东西都将受到欢迎,但是我假设我必须这样做,所以我已经做了:
最初,我尝试基于ITransformFilter创建一个过滤器。但是,似乎是在考虑只有一个输入引脚和一个输出引脚的滤波器。由于我需要几个输出引脚,因此我忽略了它,但是也许可以比我想象的更容易对其进行调整,因此,任何建议都应受到高度赞赏。
然后,我开始基于IBaseFilter。我设法做点什么。我在连接输入引脚时创建了必要的输出引脚,并在输入断开时销毁了它们。但是,当我将任何输出引脚连接到ACM包装器(只是为了对其进行测试)时,输入都会尝试重新连接,从而破坏了我的所有输出引脚。
我试图不破坏它们,但随后检查了输入引脚的媒体类型,并将其更改为立体声流。我没有从代码中调用QueryAccept。
如何避免重新连接,或者做解复用器滤波器的正确方法是什么?
编辑2010-07-09:
我回到ITransformFilter,但是我正在创建必要的引脚。但是,我遇到了与IBaseFilter相同的问题:当我将输出引脚连接到ACM包装器时,输入引脚会将其媒体类型更改为2个通道。
不确定现在如何进行...
最佳答案
您可以查看Windows Server 2003 R2平台SDK中的DMOSample。它也包含在较旧的DirectX SDK中,但不包含在较新的Windows SDK中。您可以在Samples \ Multimedia \ DirectShow \ DMO \ DMOSample中找到它。 Here是此样本的文档。
我见过有人基于此创建一个具有立体声输入和两个单声道输出的滤波器。不幸的是我无法发布源代码。
关于c++ - 如何在DirectShow中拆分音频或编写解复用器滤波器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3197028/