Android SoundPool有多糟糕?还有什么替代品?

时间:2011-06-26 14:31:28

标签: android audio soundpool

我正在将Android的SoundPool视为在我的通用游戏开发库中实现声音效果的机制。 似乎理想。

但是一些研究表明SoundPool中有all kinds of bugsSoundPool中的错误是否仍然相关?

因为我正在开发一个库,SoundPool中的任何错误都会成为我库中的错误,我希望将用户与此隔离开来。

所以我的问题基本上是:我应该将什么API用于音频?

使用AudioTrack并编写自己的调音台并非不可能。但显然最好避免这样做。是否有任何API可以为我提供解码?

我需要能够播放合理数量的同步音效(至少16个,比方说),并且更加开放。听起来需要以低延迟开始播放。需要支持WAV个文件(MP3 / Ogg不重要)。音效需要支持无缝循环和动态,单独的音量调节。需要正确支持Android应用生命周期。

我听说SoundPool某处有1MB的限制,这对于每个声音效果都是可以接受的,但对于所有缓冲/声音都不是。有人能告诉我确切的限制是什么吗?

最后,我需要能够以压缩格式播放背景音乐,并且CPU负载较低。我认为MediaPlayer是理想的。它可以与其他API并行使用吗?

我知道有些人一直在使用MediaPlayer填写SoundPool。但它是否支持我需要的功能?

我错过了其他任何音频API吗?

3 个答案:

答案 0 :(得分:15)

只是为此问题添加一些最近的反馈。我已经在一个应用程序中使用SoundPool一段时间了,该应用程序具有相当大的按键声音用户群。我们的用例:

  • 必须立即播放
  • 最多3个并行声音
  • 我们在其setRate
  • 的整个范围内使用[0.5f-2.0f]

我现在遇到了两个主要的设备特定问题,并已决定减少损失并转离SoundPool

  • 大量4.4 LG设备(主要是LG G2 / G3系列)在实施SoundPool时发生本机故障。这已在更新(最终)中修复,但我们仍然有很多用户使用未升级的设备
  • Sony Xperia设备目前与SoundPool有reported by others的各种问题。在我的情况下,我发现如果你使用setRaterate > 1.0f SoundPool开始抛出异常,直到你的应用程序退出(并在此过程中烧掉一堆电池)。

TL; DR;我不再认为调试SoundPool

的危险/麻烦是值得的

答案 1 :(得分:9)

坚持使用OGG文件和SoundPool会很好。这是Android的多平台野兽的本质,无论程序员多么努力,都会有硬件配置无法与所有重要程序一起使用。

如果这是一个资金充足且资金充足的项目,请将每个主要手机的资金添加到测试中。它实际上比程序员花时间研究并试图猜测他们的表现要便宜得多。

对不起。似乎这不是您正在寻找的答案。祝你好运!

答案 2 :(得分:3)

免责声明:我对MediaPlayer有一些经验,对我提到的其他API没有成功经验,以下信息基于我在DOC中读到的内容以及我从谷歌搜索中读到的内容

您可以将mediaplayer(用于背景音乐)与其他音频API一起使用,因为MediaPlayer会自动在其自己的线程上运行,但我相信它有高容量的CPU负载,我不认为它会占用压缩位很好,但我不太确定。

还有JetPlayer http://developer.android.com/reference/android/media/JetPlayer.html这似乎可以有效地使用,但它可以很好地播放背景音乐,然后在游戏中根据需要播放其他声音。从我读到的DOC中,它需要一个MIDI文件(我认为?),你可以对音轨进行静音和取消静音,使其按照你想要的方式工作。

我喜欢AudioTrack,因为它让你能够通过改变声音的频率在运行时编辑声音,而SoundPool也可以这样做。

虽然对于你的情况,AudioTrack似乎不会很好用,因为播放两个声音需要两个线程,因为AudioTrack阻塞(我很确定)。

使用SoundPool,我认为既然你有16个声音,可能在每个线程中使用一个SoundPool两个线程,并为每个SoundPool应用8个声音。我真的不知道,因为我从未尝试过使用SoundPool。

同样,我的信息不是基于经验,而是基于我所阅读的内容,所以我可能完全或者可能只是稍微错了,或者说,哎呀,谁知道。

我对SoundPool漏洞一无所知,因为我还没有研究过它。