哪个 API 从 ios 和 osx 中的缓冲区播放音频?

Posted

技术标签:

【中文标题】哪个 API 从 ios 和 osx 中的缓冲区播放音频?【英文标题】:Which API to play audio from a buffer in ios and osx? 【发布时间】:2012-02-04 17:09:10 【问题描述】:

我想做这个非常简单的事情:从内存中播放 PCM 音频数据。

音频样本将来自声音合成算法、预加载的样本文件或其他任何东西。我的问题实际上是关于如何播放缓冲区,而不是如何用数据填充它们。

因此,我正在寻找重新实现旧的、已弃用的 AudioWrapper(基于 AudioUnits V1)的最佳方法,但我在 Apple Documentation 中找不到这样的 API将满足以下条件:

与 10.5 到 10.7 兼容。 在 ios 中可用。 不依赖第三方库。 面向未来(例如:不基于 Carbon,64 位...)。

我正在考虑使用 OpenAL,但它真的是最好的选择吗?我已经看到 negative opinions 了,它可能过于复杂和矫枉过正,并且可能会增加性能开销?

更糟糕的是,我可以有两个不同的实现 AudioWrapper,但如果可能的话,我真的很想避免每个系统都有一个版本(ios、10.5、10.6、10.7.. .)。此外,它将使用 C++。

编辑:我需要一个良好的延迟,系统必须在 20 毫秒内响应用户交互(缓冲区必须在 44KHz 的 128 到 512 个样本之间)

【问题讨论】:

OpenAL 增加了一些开销,而且设置时间比使用原生音频 API 更长,所以在 iOS 上我建议使用 AudioQueues 或 AVFoundation。 【参考方案1】:

AudioQueues 很常见。但是,它们的 I/O 缓冲区大小足够大,以至于它们不适合交互式 I/O(例如合成器)。

为了降低延迟,试试 AudioUnits——MixerHost 示例可能是一个很好的起点。

【讨论】:

是的,我在 Apple 文档中看到了这个 API,但并没有真正深入研究它。对于我的简单需求来说,这似乎有点太“高水平”了,但这并不是一件坏事,所以为什么不呢。有没有办法通过 AudioQueues 获得良好的延迟?我需要处理 128 到 512 个样本之间的缓冲区。 @Jem 是的,AQ 是一个中间地带。对于您想要的频率,请使用 AU(更新)【参考方案2】:

不确定 OS X 10.5,但我直接使用 Audio Units API 在 OS X 10.6、10.7 和 iOS 3.x 到 5.x 上进行低延迟音频分析和合成。我用来概括 API 的包装文件只有几百行纯 C 代码,以及一些 ifdef。

Audio Queues 的延迟对于我在 iOS 上的低延迟东西来说太高了,而 iOS RemoteIO 音频单元似乎允许缓冲区短至 256 个样本(但有时在显示关闭时仅下降到 1024)在 44100采样率。

【讨论】:

好消息。我很快意识到我想要使用的功能是在 8.6 中引入的,或者自 8.5 以来已被弃用,并且 ios 和 osx 之间的 AudioUnit API 略有不同(对于“kAudioUnitSubType_RemoteIO”之类的东西)。但是,如果可以使用一些预处理器指令轻松处理这些细微的差异,那么它就可以了。我想我会为 10.5 做一个单独的实现。但说真的,Apple,这真是一团糟。

以上是关于哪个 API 从 ios 和 osx 中的缓冲区播放音频?的主要内容,如果未能解决你的问题,请参考以下文章

您如何找到音频延迟? (Windows/OSX)

如何在ios中制作轮播动画?

是否可以将 Facebook iOS API 移植到普通的 OSX 桌面应用程序?

无法从 iOS 中的文档目录播放电影

从 osx 中的任何应用程序获取选定文本的辅助功能 API 替代方案

特征检测期间 iOS Vision API“computeBlinkFunction”中的错误和冻结