我使用了几个AVAudioPlayer实例来播放重叠的声音,结果得到了严重的失真。这就是我的情况。我有一个有几个钢琴键的应用程序。当触摸一个键时,它会播放一个音符。如果我快速连续触摸6-7个按键,我的应用程序会为每个按键播放2秒的.mp3剪辑。由于我使用的是单独的音频流,它们的声音会重叠(这是应该的),但结果是大量的失真、爆裂或嗡嗡声!
怎样才能让重叠的声音清晰明了?我自己录下了钢琴的声音,它们是非常好,干净,无噪音的录音,我不明白为什么重叠的流听起来这么糟糕。即使在低音量下或通过耳机,音质也会非常差。
如有任何建议,欢迎光临!
发布于 2013-05-24 05:59:26
有几件事:
裁剪
你所描述的“嗡嗡声”几乎肯定是限幅的--将两个或更多波形相加的结果,所产生的组合波形的峰值被截断-限幅-在单位。
当你设计具有复调的虚拟合成器时,你必须考虑到一次可能播放多少个声音,并提供余量,通常是通过衰减每个声音。
在实践中,您可以通过将每个实例的volume属性设置为0.316 (对于10 dB的净空)来使用AVAudioPlayer实现此目的。(足够同时发出8个声音)
这里明显的问题是,当用户播放一个声音时,它可能看起来太安静了--你会想要尝试各种净空空间值和典型的用户行为,并根据口味进行调整(这也是信号相关的。您的钢琴样本可能比其他波形更容易/不太容易裁剪,具体取决于其录制的振幅。)
根据您的应用程序的目标用户,您可能会考虑让他们可以使用此净空参数。
不连续性/性能
你听到的爆裂声和滴答声可能不是剪辑的结果,而是你使用mp3作为音频文件格式的副作用。这是一个坏主意™。iOS设备只有一个硬件立体声mp3解码器,所以只要你打开第二个、第三个等语音,iOS就必须在中央处理器上解码mp3音频数据。根据设备的不同,在遇到下溢中断之前,你只能以这种方式解码几个音频流(显然,对于立体声文件,将其减半)……CPU根本不能及时解码足够的样本来输出音频流,所以你会听到讨厌的爆裂声和滴答声。
对于样本回放,您希望使用LPCM音频编码(如wav或aiff)或非常高效的解码方式,如ima4。我在我发布的每个包含这些类型的音频样本的应用程序中都使用过一种策略,即以mp3或aac格式发布样本,但在应用程序首次启动时将其解码为应用程序沙箱中的LPCM文件一次。这样,在解码样本时,您可以在运行时获得较小的应用程序捆绑包和较低的CPU利用率/较高的复调。(在用户等待样本被解码时,对首次用户体验的影响很小。)
发布于 2013-05-24 05:10:36
我的理解是,AVAudioPlayer不应该被那样使用。通常,当将许多声音组合成像这样的单个输出时,您希望打开单个流并自己混合声音。
发布于 2013-05-24 05:13:58
你遇到的是clipping -它的发生是因为你正在播放的声音的组合音量超过了可能的最大音量。当同时播放多个声音时,您需要降低这些声音的音量。
https://stackoverflow.com/questions/16721442
复制相似问题