Android SoundPool有多糟糕?有什么替代选择?


77

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

但是,一点点研究表明,有所有 种类的 错误SoundPool。这些错误SoundPool仍然相关吗?

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

所以我的问题基本上是:应该使用哪种API进行音频播放?

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

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

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

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

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

我还错过了其他音频API吗?


3
我查看了与您链接的错误,这些错误似乎都不是灾难性的。也许我错过了一些东西,但是我会说只使用它,当您发现错误时报告它们。感谢您完成功课!
2011年

@slf我应该指出,这些只是随机的例子-有崩溃错误(应用程序和设备)以及无音频错误的报告,这些错误都在Internet上流传。其中有很多-但我无法确定它SoundPool是否是因为越野车或人们只是没有正确使用它而已。有一些地方表明一些最严重的错误是特定于设备的。仅仅是一两个我可以忽略的旧设备吗?还是他们的许多设备需要许多不同的解决方法?(我没有足够的资源来支持。)
Andrew Russell

@AndrewRussell这是怎么回事?SoundPool无法处理提供传统1M日志输出的90K的ogg文件-完全愚蠢。我和你有同样的要求。任何提示将不胜感激。
zaf 2012年

我的应用程序在Samsung Galaxy S2上播放声音时遇到问题,我在Google上搜索了一下,发现SoundPool类是罪魁祸首,请查看更多cocos2d-x.org/boards/10/topics/7980,显然,声音池类在播放声音时遇到问题在双核手机中。因此,最好避免...
Arif Nadeem 2012年

@AndrewRussell请问您最后做了什么?我在图书馆玩了一段时间,到目前为止,它运行得并不顺利
Efi G,

Answers:


16

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

  • 必须立即播放
  • 多达3种以上的并行声音
  • 我们在setRate整个范围内利用[0.5f-2.0f]

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

  • 大量4.4台LG设备(主要是LG G2 / G3系列)在实施SoundPool时发生本机崩溃。最终,此问题已在更新中得到修复,但我们仍有许多用户使用未升级的设备
  • 索尼Xperia设备目前存在SoundPool的各种问题,正如其他人报告的那样。就我而言,我发现如果您setRaterate > 1.0fSoundPool一起使用时会开始抛出异常,直到您的应用程序退出(并耗尽整个过程中的电池)。

TL; DR; 我不再认为调试SoundPool值得冒危险/麻烦


这仍然是一个问题,这很荒谬。如果我曾经回到Android开发者(shudder),那我肯定不会使用SoundPool。公认。
安德鲁·罗素

进一步,跟进。看来,在其中一些设备上,问题不仅存在SoundPool。当我使用Xperia时,在Xperia上调整播放速率仍然存在问题AudioTrack。但上档我似乎通过能够解决它们AudioTrack,不然用SoundPool
斯帕克

2
@Sparky那么,您当前使用的是什么而不是SoundPool?AudioTrack仅使用自己的混音器实现?还是其他图书馆?
bogumil '16

@Sparky和其他有意见的人:作为声音池的替代品,您选择了什么?
IcedD​​ante

1
@Sparky好奇的人想知道您使用了什么...告诉我们您的秘密:-p
某处某人

9

坚持使用OGG文件,SoundPool就可以了。Android多平台野兽的本质是,无论程序员多么努力,都会有一些硬件配置无法与每个重要程序一起使用。

如果这是一个大型且资金充裕的项目,请在每个主要电话中添加一个用于测试的资金。实际上,这比程序员花在研究和尝试猜测其性能上的时间要便宜得多。

抱歉。似乎这不是您要找的答案。祝好运!


根据我的经验,使用OGG文件而不是MP3文件还可以。我的mp3文件分别为3 KB,3 KB,8 KB,16KB,52 KB和52 KB,每个文件都绑定到不同的手势。我永远无法全部加载;加载的最大的3个文件中的最后一个将导致“ AudioFlinger无法创建音轨,状态:-12”。我试图将它们全部更改为.ogg文件,但结果却完全相同。
john.k.doe 2012年

嗯,您的文件大小应该没有问题。有什么办法吗?
SMBiggs 2012年

我不需要超高性能,所以我采用了混合方法。较小的文件(并且我添加了更多文件;我现在有11个文件)位于声音池中(具有讽刺意味的是,所有这些文件仍然是mp3),而较大的文件每个都有自己的MediaPlayer。似乎还是越野车;有时,声音池文件之一似乎没有加载,我正在尝试诊断原因。但它们都不超过11​​KB。
john.k.doe 2012年

您在使用服务还是其他一些线程?也许您要创建多个SoundPool副本或某个管理器?我对您的描述的直觉反应是某事正在踩在另一件事的脚趾上。这些文件的大小确实微不足道-根本不应该成为问题。我建议让您自己解决问题。这样,您将有更多的眼光,并有机会更详细地解释(和提供代码)。
SMBiggs 2012年

斯科特,我可能会这样做,因为这个问题比它所具有的余地还要复杂。我在原始评论中的唯一观点是,即使将很小的mp3文件更改为ogg文件本身也不能解决问题,而将这些小的资源放在自己的MediaPlayer对象中可以解决此问题。(我会说,我认为对某些声音设置连续循环可能会导致问题;希望我有更多的时间调试它,以便确定……因此,当何时单独提出问题可能确实是个好主意。我有时间……)
john.k.doe 2012年

3

免责声明:我对MediaPlayer的经验很少,对我提到的其他API也没有成功的经验,并且以下信息基于我在DOC中阅读的内容以及从Google搜索中阅读的内容。

您可以将mediaplayer(用于背景音乐)与其他音频API一起使用,因为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错误一无所知,因为我还没有对其进行研究。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.