我应该使用哪个框架在iOS中播放低延迟的音频文件(WAV,MP3,AIFF)?
iOS有更高级别的各种音频框架,可让您简单地播放指定的文件,让您可以获得原始PCM数据的较低级别,以及介于两者之间的所有内容。 对于我们的应用程序,我们只需要播放外部文件(WAV,AIFF,MP3),但我们需要这样做以响应按下按钮,我们需要尽可能小的延迟。 (这是用于在现场制作中排队。)
现在AVAudioPlayer和这样的工作来播放简单的文件资产(通过他们的URL),但实际启动声音的延迟太大了。 对于长度超过五分钟的较大文件,启动声音的延迟可能超过一秒钟,这使得它在现场演出中完成所有但无用。
现在我知道像openAL这样的东西可以用于非常低延迟的播放,但是你可以深入到音频缓冲区,音频源,听众等。
也就是说,有没有人知道任何在较高级别工作的框架(即播放’MyBeddingTrack.mp3’)具有非常低的延迟? 预缓冲很好。 只是触发器必须快速。
如果我们可以做一些事情,比如在文件中设置播放的开始和结束点,或者改变音量甚至执行闪避等等。
以下SO问题包含使用音频单元播放文件的工作代码,特别是AudioFilePlayer。 尽管问题表明它不起作用,但它对我来说是开箱即用的 – 最后只添加一个AUGraphStart(_graph)
。
AudioFilePlayer的“ScheduledFilePrime”属性指出在开始播放之前要加载多少文件。 你可能想玩弄它。
但正如其他人所说,音频单元的学习曲线陡峭。
您可以获得的最低延迟是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/
虽然音频队列框架相对容易使用..它在幕后包含了大量的DSP重量提升(即如果你提供VBR /压缩音频……它会在播放扬声器之前将其自动转换为PCM …它也为最终用户不透明地处理了很multithreading问题。这是一个好消息,有人做一个轻量级非实时应用程序。
你提到你需要它在现场制作中排队。 我不确定这是否意味着你的应用程序是实时的……因为如果是……那么Audio Queue将难以满足你的需求。 关于这一点的好文章是Ross Bencina的 。 需要考虑的是,你不能让第三方框架或库做任何可能在幕后锁定或mallocing或deallocing等等的幕后花费的东西。这对开发实时音频应用来说太昂贵和冒险。
这就是音频单元框架的用武之地。音频队列实际上建立在音频单元框架之上(它可以自动完成很多工作)..但音频单元带给你的金属与iOS相近。 它像您希望的那样响应,并且可以轻松实现实时应用程序。 音频单元虽然有很大的学习曲线。 围绕它的一些开源包装器虽然简化了它(参见novocaine )。
如果我是你..我至少会浏览Learning Core Audio ..它可以预订任何iOS核心音频开发人员..它详细讲述了音频队列,音频单元等,并且有很好的代码示例 ..
从我自己的经验..我在一个实时音频应用程序,有一些密集的音频要求..我发现音频队列框架,并认为它是太好了,不是真的..我的应用程序工作,当我原型与光限制..但它只是在压力测试时窒息..当我不得不深入音频单元并改变架构等等时(它不是很漂亮)。 我的建议:至少作为音频单元的介绍使用音频队列..如果它满足您的需要,坚持使用它,但如果声明音频队列不再符合您的应用程序的要求,请不要害怕使用音频单元。
你需要系统声音框架。 系统声音框架适用于使用界面声音或快速响应声音等内容。 看看这里 。
AVAudioPlayer
有一个prepareToPlay
方法来预加载其音频缓冲区。 这可能会显着加快响应时间。
我遇到了和你一样的问题,但经过一段时间的研究,我发现了一个很棒的框架。 我目前正在使用kstenerud的ObjectAL声音框架。 它基于OpenAL并且具有良好的文档。 您可以使用多个图层播放背景音乐和声音效果。
这是github上的项目https://github.com/kstenerud/ObjectAL-for-iPhone这是网站http://kstenerud.github.com/ObjectAL-for-iPhone/index.html