Android SoundPool 有多糟糕? 有什么替代方案吗?

我把 Android 的 SoundPool看作是在我的通用游戏开发库中实现声音效果的一种机制。它 看起来理想。

但是一些研究表明,SoundPool中存在 所有 种类 虫子SoundPool的漏洞还有用吗?

因为我正在开发一个库,所以 SoundPool中的任何 bug 都会变成我的库中的 bug,我想让我的用户与之隔离。

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

使用 AudioTrack和编写自己的混音器并不是不可能的。但显然,最好避免这样做。有没有 API 可以为我提供解码?

我需要能够播放合理数量的同步音效(至少16,让我们说) ,并有更开放。声音需要开始以低延迟播放。需要支持 WAV文件(MP3/Ogg 不重要)。声音效果需要支持无缝循环和动态,个人音量调整。Android 应用程序的生命周期需要得到适当的支持。

我听说有一个1MB 的限制为 SoundPool的地方,这可能是可以接受的每个单独的声音效果,但不是所有的缓冲区/声音。有人能告诉我限额是多少吗?

最后,我需要能够播放背景音乐以及压缩格式,低 CPU 负载。我认为 MediaPlayer是这方面的理想选择。它可以与另一个 API 并行使用吗?

我知道一些人已经使用 MediaPlayer来填补 SoundPool。但它支持我需要的特性吗?

我还漏掉了什么音频应用程序接口吗?

23791 次浏览

坚持使用 OGG 文件和 SoundPool 就可以了。Android 是一个多平台的怪兽,它的本质是硬件配置不能适用于每一个重要的程序,无论程序员多么努力地尝试。

如果这是一个大型和资金充足的项目,增加到每个主要手机测试的资金之一。实际上,这比程序员花在研究和猜测他们的性能上的时间要便宜得多。

抱歉,看来这不是你想要的答案,祝你好运!

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

你可以把 MediaPlayer (用于背景音乐)和其他音频 API 一起使用,因为 MediaPlayer 自动运行在它自己的线程上,但是我相信它有一个很高的 CPU 负载,而且我不认为它能很好地处理压缩比特,但是我不太确定。

还有 JetPlayer http://developer.android.com/reference/android/media/JetPlayer.html,它看起来需要大量的工作才能有效地使用,但是它可以很好地播放背景音乐,然后根据需要播放游戏中的其他声音。根据我对 DOC 的了解,它需要一个 MIDI 文件(我认为?)你静音和不静音的轨道,使它如何工作,你想要的。

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

尽管就您的情况而言,AudioTrack 似乎不会很好地工作,因为播放两个声音需要两个线程,因为 AudioTrack 是阻塞的(我非常确定)。

对于声音池,我想既然你有16个声音,那么可以取两个线程,每个线程中有一个声音池,然后给每个声音池应用8个声音。不过我真的不知道,因为我从来没有试过使用 SoundPool。

再说一次,我的信息不是基于经验,只是从我读过的东西中看出来的,所以我可能完全或者只是有点错误,或者见鬼,谁知道呢。

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

只是在这个问题上增加一些最近的反馈。我在一个应用程序中使用 SoundPool 已经有一段时间了,这个应用程序拥有相当大的按键声音用户基础。我们的用例:

  • 必须马上播放
  • 最多3个以上的声音平行
  • 我们利用的 setRate跨越它的全范围 [0.5f-2.0f]

我现在已经经历了两个主要的设备特定的问题,并已决定减少我的损失和切换离开 SoundPool

  • 大量的4.4 LG 设备(主要是 LG G2/G3线)在实现 SoundPool 时出现了本机崩溃。这个问题在一次更新中得到了解决(最终) ,但是我们仍然有很多用户使用未升级的设备
  • 索尼 Xperia 设备目前有各种各样的问题与声音池作为 由其他人报告。在我的例子中,我发现如果你将 setRaterate > 1.0f一起使用,那么 SoundPool 会开始抛出异常,直到你的应用程序退出(并且在这个过程中消耗掉一大堆电池)。

我不再认为调试 SoundPool 的危险/麻烦是值得的