iOS音乐应用程序的音频框架

问题描述:

因此,我正在构建一个小型应用程序,该应用程序具有一个键盘和一些其他触发音频样本的按钮。iOS音乐应用程序的音频框架

对于这种应用,有几个预先录制的音轨(鼓,主唱,吉他手)可静音/取消静音...我有这部分工作的罚款与AVAudioPlayer

但是,因为大多数人都知道,AVAudioPlayer有点慢,如果它被指定触发一个鼓声或合成器的小型音频采样,则会有一些延迟。所以我实现了SystemSoundServices来播放短小的声音样本。只要按下按钮和声音播放之间的延迟,它工作的很好,但我有一个小问题。当样本说,重复两次,你会听到一个小的爆裂声,这是预料之中,因为它第二次击中按钮时切断播放的第一个样本。

我想通过基本检测样本是否正在播放,如果是,然后将音量设置为0,停止播放,然后再次播放样本来解决此问题。但不幸的是systemsoundservices没有内置这个功能。AVAudioPlayer不过它太慢了。我知道有CoreAudio,AudioQueue,Open AL,但这些都显得复杂,我需要做的事情。我不需要做任何类型的音频处理。

有没有人有任何建议的音频框架,不需要写100行代码只是为了播放短的音频剪辑?事情似乎是指着我花了几周的时间学习CoreAudio/AudioQueue/OpenAL,这看起来像是在浪费我的工作时间。

您可以使用AUSampler作为采样器。授予,它比SystemSounds更复杂。 AUSampler是系统提供的AudioUnit。所以你将有一个小的程序化AU配置来做,但难以实现的东西。

您可以使用AudioFileExtAudioFile来读取和创建音频文件。在AUSampler的情况下,它知道如何加载样本(在可用格式的子集中),所以您甚至不需要写入文件I/O部分。

对于更复杂的音频,您可能需要亲自处理音频流。

+1

谢谢你,这正是我正在寻找... – rbertsch8 2012-08-13 19:19:45

+0

@ rbertsch8不客气。 – justin 2012-08-13 19:21:47

你没有提及你的音轨是否被压缩,但如果它们很短,你可能会尝试使用.wav或其他未压缩的格式。 AVAudioPlayer不必花时间开始解压缩它们。它仍然有一个短暂的延迟,但没有MP3那么长。

除此之外,我认为压低和学习一个较低级别的框架将是你需要做的。

这里是一个很好的方便介绍到OpenAL的,如果你喜欢的是: http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/

编辑:此外 - 您使用的prepareToPlay方法调用调用play之前,是否正确?

+0

感谢您的回复。是的,我正在使用AVAudio的prepareToPlay。所有样本都采用.aif格式,但如有必要,我们可以更改。我认为AUSampler的justins解决方案将适用于我的案例,但如果没有,我会咬紧牙关学习OpenAL。 – rbertsch8 2012-08-13 19:28:08

+0

.aif没有真正压缩,所以你已经做了我会建议的一切。 – 2012-08-13 20:51:17

我的解决方案如下。我创建了三个具有相同URL的Avaudio Player。 当我即将开始声音时,我使用属性isPlaying来确定要播放哪个Avaudio。 声音用方法performSelector:WithObject:AfterDelay淡出。当声音消失时,用户可以再次弹奏键盘和第二个Avaudio,等等。

您需要的Avaudio数量取决于您淡出声音的速度以及您希望用户能够播放的速度。