77

我将 AndroidSoundPool视为一种在我的通用游戏开发库中实现音效的机制。这似乎很理想。

点点研究表明 . 中的错误仍然相关吗? SoundPoolSoundPool

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

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

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

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

我听说某处有 1MB 的限制SoundPool,这对于每个单独的声音效果可能是可以接受的,但对于所有缓冲区/声音来说并非如此。有人能告诉我确切的限制是多少吗?

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

我知道有几个人一直MediaPlayer在用SoundPool. 但它是否支持我需要的功能?

还有其他我错过的音频 API 吗?

4

3 回答 3

16

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

  • 必须立即播放
  • 多达 3 个以上的并行声音
  • 我们利用setRate它的全系列[0.5f-2.0f]

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

  • 大量 4.4 LG 设备(主要是 LG G2/G3 系列)在实施 SoundPool 时发生了原生崩溃。这已在更新中修复(最终),但我们仍然有很多用户使用未升级的设备
  • 正如其他人所报告的那样,索尼 Xperia 设备目前在 SoundPool 方面存在各种问题。就我而言,我发现如果您使用setRateSoundPoolrate > 1.0f并开始抛出异常,直到您的应用退出(并在此过程中消耗大量电池)。

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

于 2015-01-27T19:59:08.063 回答
9

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

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

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

于 2011-06-28T16:17:06.533 回答
3

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

您可以将 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 错误一无所知,因为我还没有研究过它。

于 2011-08-18T23:16:54.860 回答