安卓SoundPool定时问题

3

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

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文件对我来说效果很好,但其他文件我无法保证。

1
在获取音频时长后, 不要忘记调用player.release()方法. 如果MediaPlayer实例被垃圾回收器清理, 你可能会遇到错误. 这还可能导致内存泄漏, 但我不能确定. - Karl Giesing

3

确保您拥有足够的流。

在SoundPool构造函数中,第一个参数是MaxStreams。将其设置为您认为合适的值。我猜8个左右应该足够了...但根据您的声音情况可能需要更多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接