3

是否有可靠的方法来防止声音池中的声音被截断?我在声音之间的 sleep() 函数上取得了一些成功,但它们有时仍然会在开始另一个声音之前错过最后一点声音。我的应用按顺序播放短声音。杰瑞

4

2 回答 2

5

虽然这是一个老问题,但我想我会在这里发布一些东西,因为我在网上找不到这个问题的解决方案,但确实想出了一些解决方案......

当我的应用程序启动时,我得到每个声音的持续时间(使用 MediaPlayer),并将 R.id.sound_name 值和持续时间存储在一起。然后我可以使用 SoundPool 播放声音。

获取持续时间的代码:

private long getSoundDuration(int rawId){
  MediaPlayer player = MediaPlayer.create(context, rawId);
  int duration = player.getDuration();
  return duration;
}

在我的声音课上,我像往常一样播放声音,然后在这段时间内睡觉。很简单的东西。

似乎运作良好。为我提供了 SoundPool 的低延迟优势,以及链接事物的能力。

有几点需要注意:

  • 不要每次都获得持续时间,因为创建 MediaPlayer 有开销。
  • 持续时间取自文件元数据——ogg 的工作对我来说很棒,但我不能保证其他任何事情。
于 2012-02-29T04:17:11.947 回答
3

确保您有足够的 Streams。在 SoundPool 构造函数中,第一个参数是 MaxStreams。将其设置为您认为合适的任何内容。我想 8 个左右应该就足够了……但你可能需要更多,这取决于你的声音。

于 2010-10-11T22:46:55.627 回答