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

Posted

技术标签:

【中文标题】如何修复 iPhone 应用程序中的多个音频流造成失真?【英文标题】:How can I fix multiple audio streams in an iPhone app from creating distortion? 【发布时间】:2013-05-23 18:36:21 【问题描述】:

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

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

欢迎提出任何建议!

【问题讨论】:

【参考方案1】:

几件事:

剪辑

您所描述的“嗡嗡声”几乎可以肯定是削波——将两个或多个波形相加的结果,其峰值被截断的组合波形在同一处被削波。

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

实际上,您可以使用AVAudioPlayer 实现此目的,方法是将每个实例的volume 属性设置为0.316 以获得10 dB 的动态余量。 (足以同时发出 8 个声音)

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

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

不连续性/性能

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

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

【讨论】:

非常有帮助...感谢您的彻底回复!它确实解决了我的问题。【参考方案2】:

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

【讨论】:

【参考方案3】:

您遇到的是clipping — 这是因为您正在播放的声音的总音量超过了可能的最大音量。当一次播放多个声音时,您需要降低这些声音的音量。

【讨论】:

以上是关于如何修复 iPhone 应用程序中的多个音频流造成失真?的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC音视频之优化音频造成的内存增长和增加大小流

如何在 iPhone/iPad 中播放流音频

在 iPhone 上拆分音频单元流

如何在 iPhone 上实现音频流 <50 毫秒的延迟

iPhone音频流 - 保存状态?

iphone - 在后台播放音频流