使用SoundPool播放多个声音时,如何摆脱噼啪声

时间:2013-10-05 20:12:18

标签: android soundpool

每当用户触摸瓷砖时,我的应用会发出一声短促的哔声。听起来很完美。然而,如果用户拖动他们的手指,它将快速连续多次发出哔哔声,这也起作用,但也会产生噼啪声,静态的噪音。我正试图摆脱噼啪声。

我尝试了许多工作的东西:

  • 将SoundPool最大流增加到8或16 - 无效
  • 递增sndPriority,以便每次调用play()使用比最后一次更高的优先级 - 无效
  • 在前一个声音上调用sp.stop(sndPlaying) - 这实际上使得噼啪声更糟糕
  • 在具有不同Android操作系统版本的两个不同设备上进行测试,相同的噼啪声
  • 我在Audacity中修改了声音文件,我有理由相信声音文件没有问题

代码:

public void setup() {
  sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
  sndBeep = sp.load(panel.act.getApplicationContext(), R.raw.beep, 1);
}
public void play() {
  // sp.stop(sndPlaying);   -- this actually makes the crackling noise worse
  // sndPriority++;         -- this had no effect
  sndPlaying = sp.play(sndBeep, 1.0f, 1.0f, sndPriority, 0, sndFreq);
}

2 个答案:

答案 0 :(得分:2)

噪音的发生是因为最后一声和下一声蜂鸣声之间的暂停。所以,实际上你应该减少每次通话的优先级。

这应该完成最后一次哔哔声并在此之后开始新的哔哔声。

还有机会得到一些噪音。如果声音在开始或结束时包含 - 甚至是微小的噪音,那就简单了。

答案 1 :(得分:0)

我不知道爆裂的原因,但我有两点建议:

  1. 将maxStreams设置为大于1,重新递增优先级并查看它是否有一些效果。

  2. 在加载声音文件之前设置setOnLoadCompleteListener:

    sp.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundpool, int sampleId, int status) {
            loaded = true;
        }
    });
    

    然后在播放文件之前检查标志,

    if (loaded)
        sndPlaying = sp.play(sndBeep, 1.0f, 1.0f, sndPriority, 0, sndFreq);