我正在将Android的SoundPool
视为在我的通用游戏开发库中实现声音效果的机制。 似乎理想。
但是一些研究表明SoundPool
中有all kinds of bugs。 SoundPool
中的错误是否仍然相关?
因为我正在开发一个库,SoundPool
中的任何错误都会成为我库中的错误,我希望将用户与此隔离开来。
所以我的问题基本上是:我应该将什么API用于音频?
使用AudioTrack
并编写自己的调音台并非不可能。但显然最好避免这样做。是否有任何API可以为我提供解码?
我需要能够播放合理数量的同步音效(至少16个,比方说),并且更加开放。听起来需要以低延迟开始播放。需要支持WAV
个文件(MP3 / Ogg不重要)。音效需要支持无缝循环和动态,单独的音量调节。需要正确支持Android应用生命周期。
我听说SoundPool
某处有1MB的限制,这对于每个声音效果都是可以接受的,但对于所有缓冲/声音都不是。有人能告诉我确切的限制是什么吗?
最后,我需要能够以压缩格式播放背景音乐,并且CPU负载较低。我认为MediaPlayer
是理想的。它可以与其他API并行使用吗?
我知道有些人一直在使用MediaPlayer
填写SoundPool
。但它是否支持我需要的功能?
我错过了其他任何音频API吗?
答案 0 :(得分:15)
只是为此问题添加一些最近的反馈。我已经在一个应用程序中使用SoundPool一段时间了,该应用程序具有相当大的按键声音用户群。我们的用例:
setRate
[0.5f-2.0f]
我现在遇到了两个主要的设备特定问题,并已决定减少损失并转离SoundPool
setRate
和rate > 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漏洞一无所知,因为我还没有研究过它。