3

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

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

现在我知道诸如 openAL 之类的东西可以用于非常低延迟的播放,但是你已经深入到音频缓冲区、音频源、听众等。

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

如果我们可以做一些事情,比如在文件中设置播放的开始和结束点,或者改变音量,甚至执行闪避等,那么我们会得到奖励。

4

7 回答 7

3

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

你提到你需要它在现场制作中排队。我不确定这是否意味着您的应用程序是实时的.. 因为如果是.. 那么音频队列将难以满足您的需求。一篇关于这方面的好文章是Ross Bencina 的。要点是,您不能让第三方框架或库在幕后做任何可能代价高昂的事情,例如线程锁定或分配或解除分配等。这对于开发实时音频应用程序来说太昂贵且太冒险了.

这就是音频单元框架的用武之地。音频队列实际上是建立在音频单元框架之上的(它自动化了很多工作)。但音频单元让您与 iOS 一样接近金属。它可以随心所欲地响应,并且可以轻松地制作实时应用程序。音频单元有一个巨大的学习曲线。不过,有一些开源包装器可以简化它(参见novocaine)。

如果我是你.. 我至少会略读Learning Core Audio .. 这是任何 iOS 核心音频开发人员的首选书.. 它详细讨论了音频队列、音频单元等,并有出色的代码示例..

根据我自己的经验..我开发了一个实时音频应用程序,它有一些密集的音频要求..我找到了音频队列框架,并认为它好得令人难以置信..我的应用程序在我对它进行了轻微限制的原型制作时工作正常..但它只是在压力测试时窒息..那时我不得不深入研究音频单元并更改架构等(它并不漂亮)。我的建议:至少使用音频队列作为音频单元的介绍。如果它满足您的需求,请坚持使用它,但如果很明显音频队列不再满足您的应用程序的需求,请不要害怕使用音频单元.

于 2013-02-03T21:08:31.817 回答
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/

于 2013-01-29T03:24:24.167 回答
1

你需要系统健全的框架。系统声音框架是为使用界面声音或快速响应声音等而设计的。看看这里

于 2013-01-25T00:03:28.557 回答
1

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

于 2013-01-25T00:08:45.730 回答
1

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

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

于 2013-01-25T01:13:06.577 回答
1

我会使用音频队列框架。https://developer.apple.com/library/mac/ipad/#documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/Introduction/Introduction.html

于 2013-01-25T05:03:53.257 回答
1

以下SO 问题包含使用音频单元播放文件的工作代码,特别是 AudioFilePlayer。尽管问题表明它不起作用,但它对我来说是开箱即用的——只AUGraphStart(_graph)在最后添加一个。

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

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

于 2013-07-05T13:06:26.733 回答