0

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

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

任何建议表示赞赏!

4

3 回答 3

3

几件事:

剪裁

您描述的“嗡嗡声”几乎可以肯定是削波 - 将两个或多个波形相加的结果,并且产生的组合波形的峰值被截断 - 削波 - 统一。

当您设计带有复音的虚拟合成器时,您必须考虑一次可能播放多少个声音并提供动态余量,通常是通过衰减每个声音。

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

这里的一个明显问题是,当用户播放单个声音时,它可能看起来太安静了——您需要尝试各种动态余量值和典型的用户行为并根据口味进行调整(这也取决于信号。您的钢琴样本可能会剪辑更多/ 比其他波形容易,具体取决于它们记录的幅度。)

根据您应用的目标用户,您可能会考虑向他们提供此净空参数。

不连续性/性能

您听到的爆裂声和咔嗒声可能不是剪辑的结果,而是您使用 mp3 作为音频文件格式这一事实的副作用。这是一个坏主意™。iOS 设备只有一个硬件立体声 mp3 解码器,因此一旦您启动第二、第三等语音,iOS 必须在 cpu 上解码 mp3 音频数据。根据设备的不同,在遇到下溢不连续性之前,您只能以这种方式解码几个音频流(显然,将立体声文件减半)...... CPU 根本无法及时为输出音频流解码足够的样本,因此您会听到令人讨厌的爆裂声和咔嗒声。

对于示例播放,您想使用 LPCM 音频编码(如 wav 或 aiff)或解码效率极高的东西,如 ima4。在我发布的每个包含这些类型的音频样本的应用程序中,我使用的一个策略是以 mp3 或 aac 格式发布样本,但在应用程序第一次启动时将它们解码为应用程序沙箱中的 LPCM 文件. 这样,在解码样本时,您可以在运行时获得更小的应用程序包 更低的 CPU 利用率/更高的复音率。(在用户等待样本解码时,对首次用户体验的影响很小。)

于 2013-05-23T21:59:25.863 回答
0

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

于 2013-05-23T21:10:35.817 回答
0

你遇到的是削波——它的发生是因为你正在播放的声音的组合音量超过了最大可能的音量。当一次播放多个声音时,您需要降低这些声音的音量。

于 2013-05-23T21:13:57.880 回答