【发布时间】: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 开始并向后工作
标签: ios audio audiounit avaudioengine