如何编写 DirectX 音频推送源

Posted

技术标签:

【中文标题】如何编写 DirectX 音频推送源【英文标题】:How to write a DirectX audio push source 【发布时间】:2011-09-22 23:05:52 【问题描述】:

我想创建一个 DirectX“过滤器”,用于获取单个音频通道。我看过 Platform SDK 示例项目,但缺点是需要 ATL 库。

有没有一种方法可以创建 DirectX 过滤器不借助 ATL 或 MFC?即,以某种方式仅使用 gcc(例如 MinGW)和其他实际免费的工具?

【问题讨论】:

【参考方案1】:

如果我理解正确,过滤器必须是 COM 组件。如果需要,您可以从大多数编译器中编写那些。

然而,所涉及的样板文件将是难以置信,我有一个 18kloc 代码库,当变成 COM 组件时变成了 25kloc(最终把它转回来只是因为样板文件 COM 多于实际小插件的代码)。

据我所知,编写 COM 组件并不需要或总是涉及 MFC。

ATL 通过提供模板和函数在编译时处理大量细节,大大简化了这一过程。您也许可以从 GCC 使用它,但我不确定会发生什么;我怀疑它是否能正常工作,尽管它可能会起作用。

没有 ATL,您需要 MIDL 并从那里生成代码。使用免费工具可以做到这一点,它在 Wine 项目的几个地方完成;你可以在那里查看代码和工具链。

无论你在哪里做,如果你坚持使用“实际上免费”的工具(因为它们不是专门为与 COM 一起工作而设计的),这将是一种痛苦,而且是一种严重的痛苦。

【讨论】:

是的,我意识到我正在逆流而上,DirectX 就是这样。我活在希望中。 它确实有效,您可以使用免费工具来完成,但这是一种皇家痛苦。葡萄酒将是第一个寻找例子的地方;很有可能有代码可以做到这一点。【参考方案2】:

如果您有 DirectShow 过滤器,最好的起点是PushSource Windows SDK Sample,它会生成视频并使其生成音频。

还要注意 DirectShow 基类是最早的 COM 基类之一,它们不使用 ATL/MFC。基类本身也包含在 Windows SDK 中。

【讨论】:

在我拥有的平台 SDK 中,我尝试的三个示例项目都在寻找 atls.lib 时感到窒息,奇怪的是,他们试图在平台 SDK 目录本身中找到它。有问题的 PSDK 是 2003 版本。是否期望以某种方式将 PSDK“安装”到 MSVC 中,以便 MSVC 将必要的文件添加到 PSDK 中? 我检查了更早的集合 - DirectX 9.0 SDK Update (February 2005) Extras,那里也有这个 PushSource 示例。 atlbase.h 被提到过一次,但我不记得它到底用在哪里了,而且一些基本的 ATL 东西在代码中重复了,所以我认为在没有 ATL 的情况下让它链接起来并不难。

以上是关于如何编写 DirectX 音频推送源的主要内容,如果未能解决你的问题,请参考以下文章

如何实时流式传输音频文件

如何编写代码来快速停止多个音频文件?

如何编写多频音频文件?

如何使用 C# 在 android 中编写推送通知的代码?

控制其他应用的音量

如何通过命令提示符运行 DirectX 游戏