【问题标题】:Intercepting all system level audio in Mac os在 Mac os 中拦截所有系统级音频
【发布时间】:2021-06-03 14:40:57
【问题描述】:

过去几天我一直在使用 CoreAudio,我能够访问所有 AudioDevices、它们的属性并在发生变化时接收通知。但是,我现在正在努力从 mac 中的任何应用程序“拦截”音频(最好是在播放之前)。我不确定这是否可能,但this app 确实做到了。 所以我正在寻找一些指导。提前谢谢你。

【问题讨论】:

    标签: macos core-audio


    【解决方案1】:

    不幸的是,macOS 没有提供执行此操作的功能。

    实现这一点的唯一方法是修补较低级别的框架和/或驱动程序,例如 Audio Hijack。我将是一个混乱的过程。

    但根据使用情况,拥有一个音频环回虚拟音频设备可能就足够了,这样应用程序 A 可以将音频发送到其中,而应用程序 B 可以从中接收音频。这可以通过创建 Core Audio AudioServerPlugin 来完成,它是一种用户空间音频驱动机制。例如,请查看:

    https://github.com/ExistentialAudio/BlackHole
    https://github.com/kyleneideck/BackgroundMusic

    关于限制,您可以在此处阅读更多信息:
    https://stackoverflow.com/a/18595698/2576876

    您可以从那里通过提供的链接前往很多方向。

    【讨论】:

    • 我担心会是这种情况哈哈。感谢您的洞察力和资源!
    • 还有一个问题,或者您能否详细说明“应用程序 A 可以向其中发送音频,而应用程序可以从中接收音频”?就像虚拟音频设备会将音频发送到扬声器(或输出设备)然后我的应用程序也可以接收相同的音频?
    • 不,这行不通。在 AudioServerPlugin 中,您不能使用 Core Audio 中的任何客户端 API,因为这会产生 Core Audio 标头中提到的各种问题。因此,这可以防止 AudioServerPlugin(通常代表音频本身)访问系统中的任何其他设备。然而,用户应用程序可以同时使用多个设备,因此它可以使用任何(外部)音频设备和虚拟环回设备。根据您的具体用例,这可能是否足够。
    • 还请注意,可以通过编程方式创建聚合设备,并且对用户不可见。在某些情况下,这可能会提供解决方案。
    • 再次感谢您花时间详细说明。我对这种低级的东西很陌生,所以我真的很感激(你可能已经想到了,哈哈)。我的目标是能够获取正在通过任何设备播放的音频数据,以便最终将其流式传输到其他地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多