【问题标题】:Record sound of one application录制一个应用程序的声音
【发布时间】:2012-11-05 20:17:54
【问题描述】:

我想为 Mac OS X 开发一个应用程序来录制来自一个应用程序的音频。

我玩过 Soundflower,但它只能抓取完整的系统音频。
我知道我必须使用 HAL 插件。这个插件是从使用 Core Audio 的应用程序加载的,然后我可以与插件通信以获取音频。

我的问题是:这样的插件长什么样?网上有例子吗?我没有找到关于这个主题的任何信息。

【问题讨论】:

  • 在这里澄清一下:您正在寻找类似http://rogueamoeba.com/audiohijackpro/ 的东西,并且您想知道他们是如何做到的,对吧?
  • PS,您可能想在 Soundflower 上玩得更多——在 SoundflowerBed 和 Soundflower16 之间,您通常可以绕过一些应用程序不允许您选择音频输出的事实。 (此外,如果您将其作为一次性使用,而不是出售应用程序,则将代码注入目标应用程序并强制它选择您的 Soundflower16 通道 3/4 输出可能更容易,而不是从头开始编写自己的插件。)
  • 是的,没错。但是如何将一些代码注入到应用程序中以强制它选择 Soundflower 频道?网上有源代码吗?
  • 好吧,如果它是一个 Cocoa 应用程序,那就简单了;查看 F-Script 注入服务以了解如何注入,然后您只需覆盖 ObjC 运行时中的内容。不需要 Cocoa 的替代方法是使用 SIMBL 在 C 级别中注入代码和挂钩函数,这很复杂。如果你已经知道怎么做,那肯定会更容易……但如果你不知道,可能不会那么容易。 (还有一个非常简单的选项:将 Soundflower 设置为默认音频输出,并将您的所有 other 应用程序设置为使用不同的音频输出。但这仅在您仅运行可配置应用程序时才有效。)
  • 另外两个选项:首先,您要从哪个应用程序中获取音频?许多 Core Audio 应用程序已经有一种方法来配置输出,甚至可以在他们的偏好中进行自定义路由,如果可能的话,这显然是最简单的。其次,如果您只是想省钱,Piezo 的价格是 Audio Hijack 的一半,我认为它可以满足您的需求。当您在那里时,浏览 rogueamoeba 的博客和发行说明,了解他们在处理每个新操作系统版本(通常还有 Safari 和 QT 版本)时遇到的所有问题……

标签: objective-c cocoa audio record capture


【解决方案1】:

既然您已经确定使用 Cocoa 注入是解决问题的可行方案,那么让我们从这里开始吧。

您需要做的是找出应用程序中的 ObjC 类是如何设置播放音频的,并连接以设置不同的 AU 来代替默认的系统输出。

有两种选择(除了从头开始编写您自己的自定义 AU,您不需要这样做)。您可以将 AUHAL 用作 AU,并从 AUHAL 中捕获数据。从连接的角度来看,这更容易一些,但这意味着您必须编写渲染和保存音频的代码。或者你可以只挂接一个保存到文件的 AU,这有点难以挂接,但是一旦你这样做了,它就会自动渲染。

那么,你如何把东西挂起来?好吧,大多数更高级别的 CA 调用都是为了写入当前输出而编写的。如果应用程序以这种方式运行,您只需在启动时挂接以找到您的替换 AU 并将其设置为当前输出,而不是默认值。另一方面,如果应用程序直接写入存储在变量中的 AU,则必须将其挂钩以将 AU 存储为变量。如果它正在构建一个 AU 图表,您可以在图表中替换默认输出,或者将您的输出放在它前面。

请参阅TN2091 以获取一些示例代码片段,了解大多数可能性的大部分困难部分。它没有向您展示如何将它们组合在一起,并且设置输入比输出更多(因为这更难),并且术语可能会令人困惑,但如果您仔细阅读,您应该能够找到您需要的零件。

如果您之前还没有构建过简单的 AU 主机和 AU 插件,那么您真的应该花时间阅读整个 Audio Unit Development Fundamentals 指南。 (如果你认为你真的不需要知道所有这些来做一些简单的事情,那你就错了。Why CoreAudio is Hard 解释了一半的原因;OS X 版本之间的变化是另一半的原因。)

您可能还想查看 CocoaDev's CoreAudioAndAudioUnitsTutorial 页面以获取一个占位符页面,以获取没有人编写过的完整教程,其中包含指向许多有用内容的链接。

同时,如果将整个 MTCoreAudio 框架注入应用程序是可行的,它会附带大量漂亮、完整的示例。事实上,即使您不打算使用该框架,也值得阅读 Overview 文档,可能还有源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多