Android SoundPool有多糟糕? 有什么替代使用?

我把Android的SoundPool看作是在我的通用游戏开发库中实现声音效果的机制。 这似乎是理想的。

但有一点研究表明, SoundPool中存在各种各样 的 bug 。 SoundPool的错误仍然相关吗?

因为我正在开发一个库,所以SoundPool任何bug SoundPool在我的库中变成bug,并且我想让我的用户免受这个bug的SoundPool

所以我的问题基本上是: 我应该使用什么API的audio?

使用AudioTrack和编写我自己的调音台是不成问题的。 但显然最好避免这样做。 有没有任何API为我提供解码?

我需要能够播放合理数量的同步声音效果(至less16个,比方说),并且更加开放。 声音需要以低延迟开始播放。 WAV文件需要支持(MP3 / Ogg是不重要的)。 音效需要支持无缝循环和dynamic的单独音量调节。 Android应用生命周期需要得到适当的支持。

我听说SoundPool有一个1MB的限制,对于每个单独的声音效果来说这可能是可以接受的,但对于所有的缓冲区/声音来说都不是这样。 有人能告诉我究竟是什么限制?

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

我知道有几个人一直在使用MediaPlayer来填充SoundPool 。 但它支持我需要的function吗?

还有没有其他的audioAPI我错过了?

只是在这个问题上添加一些更新的反馈。 我一直在一个相当大的用户群的应用程序中使用SoundPool一段时间的按键声音。 我们的用例:

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

我现在经历了两个主要的设备问题,并决定削减我的损失,并从SoundPool切换

  • 大量4.4 LG设备(主要是LG G2 / G3线路)与他们的SoundPool实施本机崩溃。 这是固定在更新(最终),但我们仍然有很多用户与未升级的设备
  • 索尼Xperia设备目前与其他人报告的 SoundPool有各种各样的问题。 在我的情况下,我发现如果你使用setRaterate > 1.0f那么SoundPool将会抛出exception,直到你的应用程序退出(并且在进程中烧毁一堆电池)。

TL; DR; 我不再认为这是值得debuggingSoundPool的危险/麻烦

坚持与OGG文件和SoundPool将做你就好了。 这是Android的多平台野兽的本质,即不pipe程序员多么努力地尝试,硬件configuration都不会适用于每个重要的程序。

如果这是一个大型的,资金充足的项目,增加每个主要电话的资金之一进行testing。 它实际上比编程人员花费时间研究并试图猜测他们的性能要便宜得多。

抱歉。 好像这不是你正在寻找的答案。 祝你好运!

免责声明:我有一些MediaPlayer的经验,并没有与我提到的其他API的成功经验,以下信息是基于我已经读过的DOC和我从谷歌search中读到的内容。

你可以将mediaplayer(用于背景音乐)和其他audioAPI一起使用,因为MediaPlayer自动运行在它自己的线程上,但是我相信它有很高的CPU负载,而且我不认为这会占用压缩比特,但我不太确定。

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

我喜欢AudioTrack,因为它使您能够在运行时通过改变声音的频率来编辑声音,SoundPool也可以做到这一点。

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

和SoundPool,我在想,既然你有16个声音,也许在每个线程与一个SoundPool采取两个线程,并应用8声音每个SoundPool。 我不知道,因为我从来没有尝试过使用SoundPool。

而且,我的信息并不是基于经验,而是基于我读过的内容,所以我可能完全或者也许只是稍微错了,或者是谁知道。

而且我对SoundPool错误一无所知,因为我还没有研究它。