我应该使用哪个框架在iOS中以低延迟播放音频文件(WAV、MP3、AIFF)?

我应该使用哪个框架在iOS中以低延迟播放音频文件(WAV、MP3、AIFF)?,ios,core-audio,openal,Ios,Core Audio,Openal,iOS有各种音频框架,从允许您简单播放指定文件的较高级别,到允许您获取原始PCM数据的较低级别,以及介于两者之间的所有内容。对于我们的应用程序,我们只需要播放外部文件(WAV、AIFF、MP3),但我们需要这样做以响应按下按钮,我们需要延迟尽可能小。(用于在现场制作中排队。) 现在AVAudioPlayer和类似的工具可以播放简单的文件资产(通过它们的URL),但是它在实际启动声音时的延迟太大了。对于长度超过五分钟的较大文件,启动声音的延迟可能超过一秒,这使得它在现场表演中几乎没有时间 现在我知

iOS有各种音频框架,从允许您简单播放指定文件的较高级别,到允许您获取原始PCM数据的较低级别,以及介于两者之间的所有内容。对于我们的应用程序,我们只需要播放外部文件(WAV、AIFF、MP3),但我们需要这样做以响应按下按钮,我们需要延迟尽可能小。(用于在现场制作中排队。)

现在AVAudioPlayer和类似的工具可以播放简单的文件资产(通过它们的URL),但是它在实际启动声音时的延迟太大了。对于长度超过五分钟的较大文件,启动声音的延迟可能超过一秒,这使得它在现场表演中几乎没有时间

现在我知道像openAL这样的东西可以用于非常低的延迟播放,但是你会进入齐腰深的音频缓冲区、音频源、监听器等等

也就是说,有谁知道有哪种框架可以在更高级别(即播放“MyBeddingTrack.mp3”)上工作,并且延迟非常低?预缓冲很好。只是扳机要快


如果我们可以在文件中设置播放的开始点和结束点,或者更改音量,甚至执行回避等操作,那么我们将获得奖励。

您需要系统声音框架。系统声音框架是为使用界面声音或快速响应声音而设计的。看一看。

AVAudioPlayer
有一个
preparetoplayer
方法来预加载其音频缓冲区。这可能会大大加快响应时间。

我遇到了与您相同的问题,但经过一段时间的研究,我发现了一个很好的框架。 我目前正在使用kstenerud的ObjectAL声音框架。它是基于OpenAL和well文档的。您可以播放多层次的背景音乐和音效

这是github上的一个项目
这是我将使用音频队列框架的网站

您可以获得的最低延迟是音频单元RemoteIO

远程输入/输出单元

远程I/O单元(子类型kAudioUnitSubType_RemoteIO)连接到设备硬件以进行输入、输出或同时输入和输出。在不需要回声消除的情况下,将其用于播放、录制或低延迟同步输入和输出

请看以下教程:


尽管音频队列框架相对容易使用。。它在幕后包含了大量DSP繁重的功能(即,如果您为其提供VBR/压缩音频..它会在扬声器上播放之前自动将其转换为PCM..它还为最终用户不透明地处理许多线程问题。。有人在做一个轻量级的非实时应用程序,这是个好消息

您提到在现场制作中排队时需要它。我不确定这是否意味着你的应用程序是实时的。。因为如果是。。然后音频队列将努力满足您的需求。一篇关于这方面的好文章是。需要注意的是,您不能让第三方框架或库在幕后做任何可能很昂贵的事情,比如线程锁定、mallocing或deallocing等。。这对于开发实时音频应用程序来说太昂贵和风险太大了

这就是音频单元框架的用武之地。音频队列实际上是建立在音频单元框架之上的(它自动化了很多工作)。。但音频单元让您尽可能接近iOS的金属。它的响应速度和你想要的一样快,并且可以轻松地制作实时应用程序。音频单元有一个巨大的学习曲线。不过,它周围有一些开源包装器可以简化它(请参阅)

如果我是你。。我至少要浏览一下。。这是任何iOS核心音频开发人员的首选。。它详细讨论了音频队列、音频单元等,并提供了优秀的代码

根据我自己的经验。。我开发了一个实时音频应用程序,它有一些高强度的音频要求。。我找到了音频队列框架,认为它太好了,不可能是真的。。我的应用程序在使用光照限制原型时工作正常。。但它只是因为压力测试而窒息了。。那时我不得不深入研究音频单元,改变架构等等(不太好看)。我的建议是:使用音频队列至少作为音频单元的介绍。。如果它满足您的需要,请坚持使用它,但如果音频队列显然不再满足您的应用程序的要求,请不要害怕使用音频单元。

包含使用音频单元播放文件的工作代码,特别是AudioFilePlayer。尽管问题表明它不起作用,但它对我来说是开箱即用的-只需在末尾添加一个
AUGraphStart(\u graph)

AudioFilePlayer的“ScheduledFilePrime”属性说明在开始播放之前要加载多少文件。你可能想玩玩这个


但正如其他人所指出的,音频单元有一个陡峭的学习曲线。

这可能适用于单个声音,但实际上我们有几个声音需要触发。此外,文档中还指出,调用“停止”或让它完成播放会取消此操作,这意味着我们必须不断地设置它。不过,这对一次性的东西还是有好处的。不,这是针对短声音(和振动)的。正如我在问题中提到的,文件可能很长,所以不应该使用系统声音框架。还是很高兴知道,谢谢!:)我不知道那是在iOS上!现在就开始挖掘他们的SpeakHere示例。他们不喜欢这样做完整的应用程序示例,因为你现在正在挖掘一堆与该技术无关的废话(例如,他们有在OpenGL ES中渲染的视图仪表。真的吗?!你需要在音频示例中使用它吗?!应该在更高级的示例中使用!),它没有启用ARC,这意味着我必须处理很多兼容性问题,等等