gpt4 book ai didi

objective-c - 实时获取 macOS 输出设备音频缓冲区

转载 作者:行者123 更新时间:2023-12-03 23:41:54 25 4
gpt4 key购买 nike

我正在尝试在 macOS 上点击当前选择的输出音频设备,所以我基本上有一个直通监听器,可以监视当前正在输出的音频流而不影响它。
我想将这些数据实时复制到环形缓冲区,以便可以单独对其进行操作。
Apple docs 和(过时的?)SO 答案的组合令人困惑,我是否需要编写一个 hacky 内核扩展,可以为此使用 CoreAudio,还是需要与 HAL 交互?
如果可能的话,我想在 Swift 中工作。
非常感谢
(ps。我一直在看 thisthis )

最佳答案

我不知道内核扩展——他们使用特殊的“调用我们”签名证书或关闭 SIP 的必要性不鼓励随意探索。
但是你可以结合使用 CoreAudio 和 HAL AudioServer 插件来做你想做的事情,你甚至不需要自己编写插件,有几个开源版本可供选择。
CoreAudio 没有为您提供从(或“点击”)输出设备录制的方法 - 您只能从输入设备录制,因此解决此问题的方法是创建一个虚拟“直通”设备(AudioServerPlugin),而不是与任何硬件相关联,将输出复制到输入,然后将此通过设备设置为默认输出并从其输入记录。我已经使用开源 AudioServer 插件(如 BackgroundMusic)完成了这项工作。和 BlackHole [待办事项:添加更多]。
要从生成的设备点击/录制,您只需添加 AudioDeviceIOProc回调它或将设备设置为kAudioOutputUnitProperty_CurrentDevicekAudioUnitSubType_HALOutput AudioUnit上述虚拟直通设备方法存在两个问题:

  • 你再也听不到输出了,因为它被直通设备消耗了
  • 更改默认输出设备将从您的设备切换,并且点击将静音。

  • 如果 1. 是一个问题,那么一个简单的方法是创建一个包含直通设备和一个真实输出设备的多输出设备(见屏幕截图)并将其设置为默认输出设备。音量控制停止工作,但您仍然可以在 Audio MIDI Setup.app 中更改实际输出设备的音量.
    2.你可以给默认输出设备添加一个监听器,当它改变时更新上面的多输出设备。
    您可以在 swift 中完成上述大部分操作,但对于从缓冲区传递回调中进行环形缓冲区存储,您必须使用 C 或其他可以 respect the realtime audio rules 的语言(没有锁,没有内存分配等)。你可以试试 AVAudioEngine做水龙头,但 IIRC 更改输入设备是 vale of tears .
    Audio MIDI Setup app showing multi-output device set as default output, containing pass thru device (Background Music) and normal output device (Mac-mini speakers), Mac-mini speakers set as master device

    关于objective-c - 实时获取 macOS 输出设备音频缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65289111/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com