我的音乐表演应用程序使用AVAudioEngine播放音频,并使用应用程序间音频将引擎的输出发布到其他应用程序。这允许用户将音频输入到运行在同一设备上的混音器应用程序中。由于IAA在iOS上不受欢迎,而在Mac上不受支持,所以我试图用音频单元替换这个功能。
我使用Xcode模板添加了一个augn类型的音频单元扩展,我知道internalRenderBlock实际上是返回音频数据的。但是,扩展如何访问容器(主)应用程序中的音频播放?
这有可能吗?我希望这是一个常见的用例,因为音频单元被定位为IAA的替代品,但我还没有看到任何人这样做的例子。我不想处理来自主机应用程序的输入,我也不想从零开始产生声音;我需要点击包含应用程序正在播放的声音。
更新
我刚刚在应用程序扩展编程指南中读到了“应用程序扩展如何通信”一节。看上去不太乐观:
应用程序扩展只与主机应用程序直接通信。在应用程序扩展与其包含的应用程序之间没有直接通信;通常情况下,包含的应用程序在运行包含的扩展时甚至没有运行。
另外:
“今日”小部件(以及没有其他应用扩展类型)可以通过调用NSExtensionContext类的openURL:completionHandler:方法来要求系统打开其包含的应用程序。任何应用程序扩展及其包含的应用程序都可以访问私有共享容器中的共享数据。
如果这是容器和扩展之间数据共享的范围,我看不出这是如何工作的。扩展将需要实时访问AVAudioEngine节点,因此如果包含应用程序的用户更改声音、播放、暂停、更改音量等,则所有这些都会反映在主机应用程序接收的输出中。
然而,如果AUv3没有这种能力的话,我就想拿走IAA,在平台上留下了一个很大的差距。希望还有另一种我没想过的方法。
也许这需要反其道而行之,所以在我的情况下,混音器应用程序将提供音频单元扩展,然后我的应用程序(音频播放器)将成为主机,并将音频提供给混频器的分机。但是,混音器应用程序也会遇到同样的问题,即无法从其扩展部分获得输入的音频。
发布于 2020-04-22 16:25:52
除了通过AVAudioEngine播放音频之外,应用程序还必须在音频单元扩展中发布其音频输出。该应用程序扩展的输出可能会显示在其他应用程序或其他应用程序中包含的音频单元扩展的输入中。
添加:要将音频数据从应用程序发送到自己的应用程序扩展,您可以尝试将应用程序和它的扩展名放在同一个App组中,创建一组共享文件,或者内存映射共享文件。或者使用writeToFile:原子化:将音频样本块放入共享文件的环形缓冲区中。
另外,在iOS中最初的预IAA方法是使用MIDI SysEx数据包在应用程序之间传递音频样本块。这在macOS上也是可能的,它的延迟相当低。
https://stackoverflow.com/questions/61360345
复制相似问题