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

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

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

欢迎提出任何建议!

【问题讨论】:

    标签: iphone ios xcode audio avaudioplayer


    【解决方案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 — 这是因为您正在播放的声音的总音量超过了可能的最大音量。当一次播放多个声音时,您需要降低这些声音的音量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-05
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多