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

时间:2013-01-25 00:00:11

标签: ios core-audio openal

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

现在AVAudioPlayer和这样的工作可以播放简单的文件资产(通过他们的URL),但实际启动声音的延迟太大了。对于长度超过五分钟的较大文件,启动声音的延迟可能超过一秒钟,这使得它在现场演出中只能用于计时。

现在我知道像openAL这样的东西可以用于非常低延迟的播放,但是你可以深入到音频缓冲区,音频源,听众等等。

那就是说,有没有人知道任何在较高级别工作的框架(即播放'MyBeddingTrack.mp3')具有非常低的延迟?预缓冲很好。只是触发器必须快速。

奖励,如果我们可以做一些事情,比如在文件中设置播放的起点和终点,或者改变音量甚至执行闪避等等。

7 个答案:

答案 0 :(得分:2)

您可以获得的最低延迟是Audio Units,RemoteIO。

远程I / O单元

远程I / O单元(子类型kAudioUnitSubType_RemoteIO)连接到设备硬件,用于输入,输出或同时输入和输出。用于播放,录制或低延迟同时输入和输出,不需要回声消除。

看看这个教程:

http://atastypixel.com/blog/using-remoteio-audio-unit/

http://atastypixel.com/blog/playing-audio-in-time-using-remote-io/

答案 1 :(得分:2)

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

你提到在现场制作中排队需要它。我不确定这是否意味着你的应用程序是实时的...因为如果它...那么Audio Queue将难以满足你的需求。阅读这篇文章的好文章是Ross Bencina's。需要注意的是,你不能让第三方框架或库做任何可能在幕后锁定或mallocing或deallocing等等幕后花钱的东西。这对于开发实时音频应用来说太昂贵和冒险

这就是音频单元框架的用武之地。音频队列实际上建立在音频单元框架之上(它可以自动完成很多工作)..但音频单元带给你的金属与iOS相近。它像您希望的那样响应,并且可以轻松地实时应用。音频单元虽然有很大的学习曲线。围绕它的一些开源包装器虽然简化了它(参见novocaine)。

如果我是你..我至少会浏览Learning Core Audio ..这是任何iOS核心音频开发人员的预订..它详细讨论了音频队列,音频单元等,并且优秀代码examples ..

根据我自己的经验..我在一个实时音频应用程序上工作,有一些密集的音频要求..我找到了音频队列框架,并认为它太好了,不是真的..我的应用程序工作时,我原型有光限制..但它只是在压力测试时窒息..那时我不得不潜入音频单元并改变架构等等(它不是很漂亮)。我的建议:至少作为音频单元的介绍使用音频队列..如果它满足您的需要,请坚持使用它,但如果声明音频队列不再满足您的应用程序的需求,请不要害怕使用音频单元

答案 2 :(得分:1)

您需要系统声音框架。系统声音框架适用于使用界面声音或快速响应声音等内容。看看here

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我遇到了和你一样的问题,但经过一段时间的研究,我发现了一个很棒的框架。 我目前正在使用kstenerud的ObjectAL声音框架。它基于OpenAL并且具有良好的文档。您可以使用多个图层播放背景音乐和声音效果。

这是github上的项目https://github.com/kstenerud/ObjectAL-for-iPhone 这是网站http://kstenerud.github.com/ObjectAL-for-iPhone/index.html

答案 5 :(得分:1)

答案 6 :(得分:1)

following SO question包含使用音频单元播放文件的工作代码,特别是AudioFilePlayer。虽然问题表明它不起作用,但它对我来说是开箱即用的 - 最后只添加AUGraphStart(_graph)

AudioFilePlayer的'ScheduledFilePrime'属性指出在开始播放之前要加载多少文件。你可能想玩弄它。

但正如其他人所说,音频单元的学习曲线陡峭。