2

所以我正在构建一个小应用程序,它有一个键盘和一些触发音频样本的其他按钮。

对于这个应用程序,有几个预先录制的音轨(鼓、人声、吉他)可以静音/取消静音......我让这部分与 AVAudioPlayer 一起工作正常

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

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

有没有人对不需要编写 100 行代码来播放短音频剪辑的音频框架有任何建议?一切似乎都在告诉我要花数周时间学习 CoreAudio/AudioQueue/OpenAL,而这似乎是在浪费我正在做的事情的时间。

4

3 回答 3

1

您可以使用AUSampler采样器。当然,它比 SystemSounds 更复杂。这AUSampler是系统提供的 AudioUnit。所以你需要做一些程序化的 AU 配置,但困难的事情是遥不可及的。

您可以使用AudioFileandExtAudioFile来读取和创建音频文件。对于 AUSampler,它知道如何加载样本(以可用格式的子集),因此您甚至不需要编写文件 i/o 部分。

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

于 2012-08-13T19:12:34.510 回答
0

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

除此之外,我认为屈从并学习较低级别的框架之一将是您需要做的。

如果您喜欢,这里是 OpenAL 的简单介绍:http: //benbritten.com/2008/11/06/openal-sound-on-the-iphone/

编辑:另外-您在prepareToPlay调用之前使用方法调用play,对吗?

于 2012-08-13T19:13:56.900 回答
0

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

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

于 2013-08-29T01:53:43.587 回答