41

我想创建一个虚拟音频设备,从默认输出(即输出 IOAudioStream)获取音频数据并将其转换为输入 IOAudioStream。

我浏览了我能找到的大多数示例,但是它们仅实现了一项功能,即最多将输出 IOAudioStream 复制到输入。这意味着如果选择音频设备作为输出,它只会将音频转换为输入流。

这应该是可能的,因为 ScreenFlow 允许通过安装创建虚拟驱动程序的 kext 来录制计算机音频。

如何从默认输出访问音频数据并将其发送到我的虚拟驱动程序?

4

3 回答 3

65

看看开源的WavTap,它是开源SoundFlower虚拟声卡驱动程序的简化分支。它是一个 .kext,我相信它基本上可以满足您的需求。

作为参考,以下是一些流行的商业闭源选项的工作方式:
Rogue Amoeba 的Audio Hijack Pro
- 通过基于开源 SoundFlower .kext 的代码捕获系统
音频 - 通过替换“补丁”框架来捕获应用程序的音频启动应用程序时的正常 CoreAudio.framework
- 在 Unsanity 的 haxie “Application Enhancer” (APE) 的帮助下捕获已经运行的应用程序的音频

这些功能被称为“Instant On”功能 (InstantOn.kext)。

Ambrosia Software 的WireTap Studio
- 通过内部开发的 .kext 捕获系统音频和应用程序音频

Telestream 的ScreenFlow - 通过内部开发的 .kext 捕获
系统音频。(2.x 版使用 varaudio.kext;3.x 版使用 TelestreamAudio.kext)

Macsome 的录音机
- 未知 方法

Araelium Group 的Screenflick -
使用 SoundFlower .kext 捕获系统音频

更新 #1
在阅读了作者的评论后,似乎基本目标是能够在将虚拟音频驱动程序发布为设备(将出现在系统偏好设置列表中)并且更改当前默认输出设备的情况下捕获系统声音(或至少设备已更改的外观)。

SoundFlower:安装时将声音设备添加到列表中
WavTap:安装时将声音设备添加到列表中;启动 WavTap 应用程序时自动选择设备;应用程序关闭时自动取消选择设备并重新选择之前的设备
Audio Hijack Pro:仅在选择默认系统声音的音频捕获时添加声音设备;当不再选择音频捕获时删除声音设备并重新选择以前的设备
WireTap Studio:未知
ScreenFlow:捕获系统声音而不更改当前默认输出设备,也不将虚拟音频驱动程序发布为设备

更新 #2
引用 CoreAudio Apple 工程师 Jeff Moore 对 WireTap 和 Audio Hijack Pro 等应用程序的引用:
“系统上没有 API 可以为您提供任何特定应用程序或整个混音的输出。硬件...[捕获系统声音] 不受系统支持,这些人必须很聪明。没有什么能阻止你做同样的事情,除了你多么愿意弄脏你的手。事实是,Mac OS X 的音频系统首先是为性能而设计的。这导致我们的设计很难在不影响性能的情况下支持您想要的功能。因此,我们选择了更好的性能,但代价是不能提供此功能。”

如果您想了解有关该主题的更多信息,请查看 CoreAudio API 邮件列表中的这些主题:
“WireTap、CoreAudio 的 API、系统捕获和 kexts……”
“另一个关于捕获软件播放的音频的问题”
“在 Mac 上使用 CoreAudio 捕获当前播放的音频"
"'音频劫持'"
"监控系统音频输出,如窃听"
"捕获音频输出到文件"
"镜像音频输出"
"录制系统音频"

相关 SO 问题:
使用无代码 kext 隐藏音频设备

长话短说,您不太可能从 Apple 中找到实现此目的的示例,而且您也不太可能找到实现此目的的开源代码,除非有人感到非常慷慨。它似乎太有价值的信息。

于 2013-09-03T15:09:21.353 回答
8

经过进一步研究,以下是我提出的一些理论技术,可以帮助您实现目标:

  1. 与 Prosoft Engineering 的Hear产品类似,您可以创建 HAL 插件(用户模式虚拟驱动程序)而不是 .kext(内核模式虚拟驱动程序)。Apple 有一个名为“SampleHardwarePlugIn”的示例 HAL 插件,PulseAudio也有一个。但是,使用他的方法,我认为您无法访问预混系统声音流。您必须收集来自各种应用程序的所有流(必须使用 CoreAudio 播放声音)并将它们混合在一起以进行伪系统声音捕获。

  2. 创建一个从用户交互中隐藏[1] [2]的虚拟音频设备。当用户希望捕获默认声音时,以编程方式创建一个聚合设备,其中包括您隐藏的虚拟设备和当前的默认声音设备。暂时将此聚合设备设置为默认输出。通过这种方式,您既可以捕获默认声音,也可以听到它。
    旁注:如果 Mac OS X 允许将隐藏设备也设置为默认输出设备,系统偏好设置会显示什么作为所选设备?如果它改为将辅助输出设备显示为已选择,那么您会添加一个暗示,即没有任何变化。

于 2013-09-08T20:10:41.943 回答
1

与最新版本的 MacOS 一起使用的较新的开源虚拟音频设备是BlackHole——它支持多个音频通道和采样率。

它可以用作音频接收器和/或源。作为聚合音频设备的一部分,它也很方便,因此可以听到音频并重新路由 - 例如使用 MacOS 音频 MIDI 设置应用程序

于 2021-10-14T13:34:03.670 回答