我想为 Mac OS X 开发一个应用程序来录制来自一个应用程序的音频。
我玩过 Soundflower,但它只能获取完整的系统音频。
我知道我必须使用 HAL 插件。该插件是从使用 Core Audio 的应用程序加载的,然后我可以与插件通信以获取音频。
我的问题是:这样的插件长什么样?网上有例子吗?我还没有找到关于这个话题的任何东西。
我想为 Mac OS X 开发一个应用程序来录制来自一个应用程序的音频。
我玩过 Soundflower,但它只能获取完整的系统音频。
我知道我必须使用 HAL 插件。该插件是从使用 Core Audio 的应用程序加载的,然后我可以与插件通信以获取音频。
我的问题是:这样的插件长什么样?网上有例子吗?我还没有找到关于这个话题的任何东西。
既然您已经决定使用 Cocoa 注入是解决问题的可行方案,那么让我们从这里开始吧。
您需要做的是找出应用程序中的 ObjC 类是如何设置播放音频的,并连接以设置不同的 AU 来代替默认的系统输出。
有两种选择(除了从头开始编写您自己的自定义 AU,您不需要这样做)。您可以将 AUHAL 用作 AU,并从 AUHAL 中捕获数据。从连接的角度来看,这更容易一些,但这意味着您必须编写渲染和保存音频的代码。或者你可以只挂接一个保存到文件的 AU,这有点难以挂接,但是一旦你这样做了,它就会自动处理渲染。
那么,你如何把东西挂起来呢?好吧,大多数更高级别的 CA 调用都是为了写入当前输出而编写的。如果应用程序以这种方式运行,您只需在启动时挂接以找到您的替换 AU 并将其设置为当前输出,而不是默认值。另一方面,如果应用程序直接写入存储在变量中的 AU,则必须挂钩它以将 AU 存储为变量。如果它正在构建 AU 图表,您可以在图表中替换默认输出,或者将您的输出放在它前面。
有关大多数可能性的大多数困难部分的一些示例代码片段,请参见TN2091。它没有向您展示如何将它们组合在一起,并且设置输入比输出更多(因为这更难),并且术语可能会令人困惑,但如果您仔细阅读,您应该能够找到您需要的零件。
如果您之前还没有构建过简单的 AU 主机和 AU 插件,那么您真的应该花时间阅读整个音频单元开发基础指南。(如果你认为你真的不需要知道所有这些来做一些简单的事情,那你就错了。为什么 CoreAudio 很难解释了一半的原因;OS X 版本之间的变化是另一半的原因。 )
您可能还想查看CocoaDev 的 CoreAudioAndAudioUnitsTutorial页面,以获取没有人编写过的完整教程的占位符页面,其中包含指向许多有用内容的链接。
同时,如果将整个MTCoreAudio框架注入应用程序是可行的,它会附带大量漂亮、完整的示例。事实上,即使您不打算使用该框架,也值得阅读概述文档,可能还有源代码。