【问题标题】:How can I get rid of crackling noise when playing multiple sounds with SoundPool使用 SoundPool 播放多个声音时如何消除噼啪声
【发布时间】:2013-10-06 05:03:51
【问题描述】:

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

我尝试了很多没有奏效的方法:

  • 将 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);
}

【问题讨论】:

    标签: android soundpool


    【解决方案1】:

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

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

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

    【讨论】:

    • 我把它改成降低每次调用的优先级,并将max Streams设置为16,应该足够不重叠了,噪音也大大降低了,但我还是偶尔会听到,我'不知道为什么。有关如何更改文件以摆脱它的任何提示?我尝试在它的每一端添加 0.02 秒的静音。
    • 另外:如果我尽可能快地拖动手指以发出大量重复的声音,我偶尔可以让它完全停止播放音频。我已经通过调试器运行它,在那种状态下一切看起来都很好。重新启动应用程序修复它。知道那里发生了什么吗?
    • 也许你在开始或结束时确实有一些微小的噪音。噪音重叠,偶尔会出现在人类可听到的声音区域。可以编辑声音吗?确保您的频率处于较低 KHz 区域(例如
    • 嗯,它肯定是重叠的,因为我将最大流设置为 16。如果我降低优先级并将最大流设置为 1,它只会跳过会重叠的哔哔声,这不是所需的行为。所以它与哔哔声重叠,大部分时间都很好,但我仍然听到噪音,通常在最后一次哔哔声结束时。我很确定声音的开始和停止是完全无声的。
    • 所以我明白了,你是说问题是两个噪音重叠并导致不和谐之类的吗?意思是,这是我演奏的噪音的合理结果?因为在我看来,这更像是 Android 添加了与正在播放的音调无关的点击。
    【解决方案2】:

    我不知道那噼啪声的原因,但我有两个建议:

    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);
      

    【讨论】:

    • 我已经尝试过 1。我相信 2 只有在您动态加载文件时才需要 - 我在应用程序启动时加载一次,然后一遍又一遍地播放。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2021-04-25
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多