iPhone音乐应用程序:从Notes缓存中播放

时间:2009-07-23 20:00:45

标签: iphone objective-c avaudioplayer

我正在开发一款可以播放12音音符的应用 横跨几个八度的全音阶。这将基本上 是一个临时波表合成器。

与使用的仪器数量相关的时间。

备注存储为.wav文件,并将缓存到RAM中 防止硬盘检索的开销。但是,有一个 自.wav文件以来,在物理内存方面的主要时空权衡 可以很大。

有没有人知道如何更多地缓存这些.wav文件 节省空间的?压缩是一个很好的选择,但太多会降低质量。 即时调制或扭曲频率肯定会 太迟钝了。如果我错了,请纠正我,但是使用此实现来玩200 BPM 不行。

如果您有使用音乐应用的经验,请分享您的建议。

2 个答案:

答案 0 :(得分:1)

本身没有使用音乐应用程序的经验,但我使用过音频,包括录音。

在iPhone上,由于尺寸限制和磁盘速度,您通常不会将整个音频加载到RAM中。使用AudioQueue API,编写一个回调函数,从磁盘填充缓冲区(通常使用AudioFile方法)。您可以适当选择缓冲区大小和缓冲区计数,以使应用程序的音频播放顺利运行。

您也应该检查压缩可能性;像无损AAC这样的东西可以让你减少50%的文件大小而不会降低质量,但代价是显着增加了处理开销。

听起来你真的想在这里过早地进行优化。写一些实验代码,看看是否可以从标准文件加载风格的音频播放例程中获得200BPM。由于解码时间的原因,使用WAV的文件加载方式实际上比压缩和使用RAM更快。

答案 1 :(得分:1)

您应该使用IMA4压缩将.wav文件压缩为caf文件(Core Audio Format)。 iPhone可以同时播放多个这些文件(MP3 / AAC不能,因为你需要硬件解码器)..

您可以在Mac OS X上使用以下终端命令将WAV转换为CAF:

$ afconvert -f caff -c 1 -d ima4 loop1.wav

此外,如果您使用AVAudioPlayer(AVFoundation)播放这些内容,您将不必担心缓存,因为AVAudioPlayer已经这样做了。对于更高级的音频,您需要查看音频服务(音频队列)。