我试图tapmacOS 上当前选择的输出音频设备,因此我基本上有一个直通侦听器,可以监视当前正在输出的音频流而不影响它。
我想将这些数据实时复制到环形缓冲区,以便我可以单独对其进行操作。
Apple 文档和(过时?)SO 答案的结合令人困惑,我是否需要编写一个 hacky 内核扩展,可以利用 CoreAudio 来实现此目的,还是需要与 HAL 接口?
如果可能的话,我想用 Swift 工作。
非常感谢
(ps.我一直在看this https://github.com/jasminlapalme/caplaythrough-swift and this https://stackoverflow.com/a/871987)
我不知道内核扩展 - 它们使用特殊的“call us”签名证书或关闭 SIP 的必要性阻碍了随意探索。
但是,您可以使用 CoreAudio 和 HAL AudioServer 插件的组合来完成您想要的操作,甚至不需要自己编写插件,有多个开源版本可供选择。
CoreAudio 没有为您提供从(或“点击”)输出设备进行录制的方法 - 您只能从输入设备进行录制,因此解决此问题的方法是创建一个虚拟“传递”设备(AudioServerPlugin),而不是与任何硬件关联,将输出复制到输入,然后将此传递设备设置为默认输出并从其输入进行记录。我已经使用开源 AudioServer 插件完成了此操作,例如背景音乐 https://github.com/kyleneideck/BackgroundMusic and 黑洞 https://github.com/ExistentialAudio/BlackHole[TODO:添加更多]。
要从生成的设备中点击/录制,您只需添加一个AudioDeviceIOProc
回调它或将设备设置为kAudioOutputUnitProperty_CurrentDevice
of an kAudioUnitSubType_HALOutput
AudioUnit
上述虚拟直通设备方式存在两个问题:
- 您无法再听到输出,因为它被直通设备消耗
- 更改默认输出设备将远离您的设备,并且点击将变得安静。
如果 1. 是一个问题,那么一个简单的方法是创建一个包含传递设备和真实输出设备的多输出设备(参见屏幕截图)并将其设置为默认输出设备。音量控制停止工作,但您仍然可以更改实际输出设备的音量Audio MIDI Setup.app
.
对于2.您可以向默认输出设备添加监听器,并在其发生变化时更新上面的多输出设备。
您可以快速完成上述大部分操作,尽管对于缓冲区传递回调中的环形缓冲区存放,您必须使用 C 或其他一些可以实现的语言尊重实时音频规则 http://atastypixel.com/blog/four-common-mistakes-in-audio-development/(没有锁,没有内存分配等)。你也许可以尝试AVAudioEngine
进行点击,但 IIRC 更改输入设备是泪谷 https://stackoverflow.com/a/32676293/22147.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)