如何修复iPhone应用程序中的多个音频流以免造成失真?

时间:2013-05-23 18:36:21

标签: iphone ios xcode audio avaudioplayer

我正在使用AVAudioPlayer的几个实例来播放重叠的声音,并因此导致严重的失真。这是我的情况......我有一个带有几个钢琴键的应用程序。触摸键时,它会弹奏一个音符。如果我快速连续触摸6-7键,我的应用程序会为每个键播放2秒.mp3剪辑。由于我使用单独的音频流,它们听起来重叠(他们应该这样),但结果是很多失真,砰砰声或嗡嗡声!

如何使重叠的音频清晰干净?我自己录制了钢琴声,它们是非常漂亮,干净,无噪音的录音,我不明白为什么重叠的声音听起来如此糟糕。即使是低音量或通过耳机,质量也会降低。

任何建议都表示赞赏!

3 个答案:

答案 0 :(得分:3)

一些事情:

剪辑

你所描述的“嗡嗡声”几乎可以肯定是剪辑 - 将两个或多个波形加在一起的结果,以及产生的合并波形的峰值被切断 - 整齐。

当您使用复音设计虚拟合成器时,您必须考虑一次可以播放多少个声部并提供余量,通常是通过衰减每个声音。

在实践中,您可以使用AVAudioPlayer通过将每个实例volume属性设置为0.316(10 dB的余量)来实现此目的。 (足够8个同时发声)

这里显而易见的问题是,当用户播放单个声音时,它可能看起来太安静了 - 您需要尝试各种余量值和典型的用户行为并调整品味(它还与信号有关。您的钢琴样本根据记录的振幅,可能比其他波形更容易/更少地剪辑。)

根据您应用的预期用户,您可以考虑向他们提供此余量参数。

不连续/效果

您听到的弹出和点击可能不是剪辑的结果,而是您使用mp3作为音频文件格式这一事实的副作用。这是一个坏主意™。 iOS设备只有一个硬件立体声mp3解码器,因此只要你启动第二个,第三个等语音,iOS就必须解码cpu上的mp3音频数据 。根据设备的不同,您只能在遭受下溢不连续之前以这种方式解码几个音频流(明显地将立体声文件切成两半)...... CPU根本无法及时解码输出音频流的足够样本,所以你会听到令人讨厌的流行音乐和点击。

对于样本回放,您希望使用LPCM音频编码(如wav或aiff)或极其高效的解码功能,如ima4。我在我发布的具有这些类型的音频样本的每个应用程序中使用的一种策略是以mp3或aac格式发送样本,但在应用程序首次启动时将其解码为应用程序沙箱中的LPCM文件。这样,在解码样本时,您可以在运行时获得较小的应用程序包低CPU利用率/更高复音的好处。 (当用户等待样本被解码时,对第一次用户体验的影响很小。)

答案 1 :(得分:0)

我的理解是AVAudioPlayer不应该像这样使用。通常,当将大量声音组合成单个输出时,您需要打开单个流并自己混合声音。

答案 2 :(得分:0)

您遇到的是clipping - 它正在发生,因为您正在播放的声音的总量超过了可能的最大音量。当一次播放多个声音时,您需要减小这些声音的音量。