【问题标题】:audio framework for iOS music app [closed]iOS音乐应用程序的音频框架[关闭]
【发布时间】:2012-08-13 19:02:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: objective-c ios frameworks core-audio


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这正是我要找的……
    【解决方案2】:

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

    除此之外,我认为你需要做的是认真学习并学习其中一个较低级别的框架。

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

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

    【讨论】:

    • 感谢您的回复。是的,我正在将 prepareToPlay 与 AVAudio 一起使用。所有样本都是 .aif 格式,但如有必要,我们可以更改它。我认为 AUSampler 的 justins 解决方案将适用于我的情况,但如果不是,我将硬着头皮学习 OpenAL。
    • .aif 没有真正压缩,所以你已经按照我的建议做了。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多