2

每当用户触摸磁贴时,我的应用程序都会发出一声短促的哔声。听起来很完美。但是,如果用户拖动手指,它会快速连续播放多次哔哔声,这很有效,但也会产生噼啪声、静态的噪音。我正在努力摆脱裂纹。

我尝试了很多没有用的东西:

  • 将 SoundPool 最大流增加到 8 或 16 - 无效
  • 增加 sndPriority 以便每次调用 play() 使用比最后一个更高的优先级 - 无效
  • 在前一个声音上调用 sp.stop(sndPlaying) - 这实际上使噼啪声更糟
  • 在具有不同 Android OS 版本的两台不同设备上进行测试,相同的裂纹
  • 我已经修改了 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);
}
4

2 回答 2

2

噪音的发生是因为最后一次和下一次哔声之间的短暂停顿。因此,实际上您应该降低每次调用的优先级。

这应该完成最后一次哔声,然后才开始新的哔声。

仍然有机会获得一些噪音。只要声音在开始或结束时包含 - 甚至是微小的 - 噪音。

于 2013-10-05T20:47:09.703 回答
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);
    
于 2013-10-05T21:03:51.307 回答