音频单元 (v3) 可以替换应用间音频以将音频发送到主机应用程序吗?

Posted

技术标签:

【中文标题】音频单元 (v3) 可以替换应用间音频以将音频发送到主机应用程序吗?【英文标题】:Can an audio unit (v3) replace inter-app audio to send audio to a host app? 【发布时间】:2020-04-22 08:17:13 【问题描述】:

我的音乐表演应用使用AVAudioEngine 播放音频,并使用应用间音频将引擎的输出发布到其他应用。这允许用户将音频馈送到在同一设备上运行的混音器应用程序中。由于 IAA 在 ios 上已弃用且在 Mac 上不受支持,因此我正在尝试用音频单元替换此功能。

我使用 Xcode 模板添加了 augn 类型的音频单元扩展,并且我知道 internalRenderBlock 是实际返回音频数据的内容。但是扩展如何访问容器(主)应用程序中播放的音频?

这甚至可能吗?我希望这是一个常见的用例,因为音频单元被定位为 IAA 的替代品,但我还没有看到任何人这样做的例子。我不想处理来自主机应用程序的输入,也不想从头开始生成声音;我需要点击包含应用程序正在播放的声音。

更新

我刚刚阅读了App Extension Programming Guide 中的“应用程序扩展如何通信”部分。看起来不太乐观:

应用扩展仅与宿主应用直接通信。应用扩展程序与其包含的应用程序之间没有直接通信;通常,包含的应用程序甚至在包含的扩展程序运行时都不会运行。

还有:

Today 小部件(并且没有其他应用程序扩展类型)可以通过调用 NSExtensionContext 类的 openURL:completionHandler: 方法来请求系统打开其包含的应用程序。任何应用扩展及其包含的应用都可以访问私有定义的共享容器中的共享数据。

如果这就是容器和扩展程序之间数据共享的范围,我看不出它是如何工作的。该扩展程序需要实时访问AVAudioEngine 节点,因此如果包含应用程序的用户更改声音、播放、暂停、更改音量等,所有这些都将反映在主机应用程序接收的输出中。

但如果 AUv3 不具备此功能,我想取消 IAA,从而在平台上留下很大的空白。希望还有另一种我没有想到的方法。

也许这需要反过来工作,所以在我的情况下,混音器应用程序将提供音频单元扩展,然后我的应用程序(音频播放器)将成为主机并将音频提供给混音器的扩展.但是混音器应用也会遇到同样的问题,即无法从其扩展中获取传入的音频。

【问题讨论】:

对此也很感兴趣,但遗憾的是没有洞察力。我将从AudioUnitExternalBuffer 开始并向后工作 【参考方案1】:

除了通过 AVAudioEngine 播放音频外,应用还必须在音频单元扩展中发布其音频输出。该应用扩展的输出可能对其他应用的输入或其他应用中包含的音频单元扩展可见。

添加:要将应用程序中的音频数据发送到它自己的应用程序扩展,您可以尝试将应用程序及其扩展程序放在同一个App Group,创建一组共享文件,也许内存映射共享文件(s )。或者使用 writeToFile:atomically: 将音频样本块放入共享文件的环形缓冲区。

此外,iOS 中最初的 pre-IAA 方法是使用 MIDI SysEx 数据包在应用程序之间传递音频样本块。这在 macOS 上也可能是可能的,具有相当低的延迟。

【讨论】:

我不确定您所说的“又一个”扩展是什么意思。我的应用程序只需要发布一个扩展程序,然后其他(主机)应用程序将使用该扩展程序,对吗?当我运行 Apple 的 FilterDemo 应用程序并访问 Auria 中的扩展时,它就是这样工作的。有两个应用程序,但只有一个扩展程序。我坚持的是音频单元扩展如何访问由其包含的应用程序生成的音频。 对于“共享文件的环形缓冲区”,您的意思是我可以使用github.com/michaeltyson/TPCircularBuffer 之类的东西并将数据以某种方式映射到文件路径,或者我必须实现相同的总体原则但是使用文件而不是内存? 原理相同,但使用内存映射文件(见 man mmap)。【参考方案2】:

我联系了 Apple 开发者技术支持,他们建议继续在 iOS 上使用 IAA。

他们还提到了在容器和扩展程序之间与应用程序组中的文件交换数据,我认为这不适合实时音频,但 hotpaw2 的回答提供了一些关于使其工作的提示。

我确实找到了一些 Mac 的第三方替代品:

Loopback - 向用户收费 100 美元,但我通过免费试用版对其进行了测试,并且成功了

Blackhole - 对用户免费,开源,并可能获得许可以集成到其他应用程序中;我没试过

【讨论】:

以上是关于音频单元 (v3) 可以替换应用间音频以将音频发送到主机应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在音频单元扩展(实时进程)中为音频文件播放分配内存?

发布 iOS 音频单元

如何使用音频单元 osx 从设备音频输入中获取音频

我可以从 MPMusicPlayerController 获取音频会话/应用音频单元播放吗?

如何从音频单元获取 NSView 对象

Android 录制音频没有 SDCARD