【问题标题】:How bad is Android SoundPool? What alternative to use?Android SoundPool 有多糟糕?使用什么替代品?
【发布时间】:2011-09-22 23:55:35
【问题描述】:

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

但是一点点研究表明SoundPool 中有allkindsofbugsSoundPool 中的错误是否仍然相关?

因为我正在开发一个库,SoundPool 中的任何错误都会成为我库中的错误,我希望我的用户不会受到影响。

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

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

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

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

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

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

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

【问题讨论】:

  • 我查看了您链接到的错误,但似乎没有一个是灾难性的。也许我遗漏了一些东西,但我会说只是使用它,当你发现错误时报告它们。感谢你做功课!
  • @slf 我应该指出,这些只是随机的例子——互联网上有关于崩溃错误(应用程序和设备)和无音频错误的报告。其中有 很多 - 但我不知道是因为 SoundPool 有问题还是人们没有正确使用它或其他原因。有几个地方表明一些最严重的错误是特定于设备的。我可以忽略一两个旧设备吗?还是他们的许多设备需要许多不同的解决方法? (我没有资源支持。)
  • @AndrewRussell 这是怎么回事? SoundPool 不处理 90K 的 ogg 文件,提供经典的 1M 日志输出 - 完全愚蠢。我和你有同样的要求。任何提示将不胜感激。
  • 我的应用程序在三星 Galaxy S2 上播放声音时出现问题,我四处搜索发现 SoundPool 类是罪魁祸首,请查看更多cocos2d-x.org/boards/10/topics/7980,显然 soundpool 类在双声道播放声音时出现问题核心手机。所以最好避免它......
  • @AndrewRussell 请问你最后做了什么?我在图书馆玩了一段时间,到目前为止它运行得不是很好

标签: android audio soundpool


【解决方案1】:

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

  • 必须立即播放
  • 最多并行 3 个以上的声音
  • 我们在其全系列 [0.5f-2.0f] 中使用 setRate

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

  • 大量 4.4 LG 设备(主要是 LG G2/G3 系列)在实施 SoundPool 时发生本机崩溃。这已在更新中得到修复(最终),但我们仍有很多用户使用未升级的设备
  • Sony Xperia 设备目前在 SoundPool 方面存在各种问题,如reported by others。在我的情况下,我发现如果您使用 setRaterate > 1.0f,SoundPool 会开始引发异常,直到您的应用退出(并在此过程中消耗大量电池)。

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

【讨论】:

  • 这仍然是一个问题是荒谬的。如果我再次进入 Android 开发(shudder),那么我肯定不会使用 SoundPool。接受。
  • 进一步跟进。似乎在其中一些设备上,问题比SoundPool 更深层次。当我使用AudioTrack 时,在 Xperia 上调整播放速率仍然存在问题。但从好的方面来说,我似乎可以通过AudioTrack 解决它们,而不是SoundPool
  • @Sparky 那么您目前使用的是什么而不是 SoundPool? AudioTrack 仅使用您自己的混音器实现?还是其他图书馆?
  • @Sparky 和其他有意见的人:你用什么作为 soundpool 的替代品?
  • @Sparky 好奇的人想知道你用什么代替...告诉我们你的秘密:-p
【解决方案2】:

坚持使用 OGG 文件,SoundPool 可以满足您的需求。 Android 是多平台野兽的本质,无论程序员如何努力尝试,硬件配置都无法与每个重要程序一起使用。

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

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

【讨论】:

  • 根据我的经验,使用 OGG 文件而不是 MP3 文件可以正常工作。我有 3 KB、3 KB、8 KB、16KB、52 KB 和 52 KB 的 mp3 文件,每个文件都与不同的手势相关联。我永远无法将它们全部加载;加载最大的 3 个中的最后一个将导致“AudioFlinger 无法创建轨道,状态:-12”。我尝试将它们全部更改为 .ogg 文件,结果完全相同。
  • 嗯,你的文件大小应该没问题。有什么解决办法吗?
  • 我不需要超高性能,所以我采用了混合方法;较小的文件(我已经添加了更多;我现在有 11 个)位于声音池中(具有讽刺意味的是,所有这些文件仍然是 mp3),而较大的文件每个都有自己的 MediaPlayer。似乎仍然有问题;有时,其中一个 soundpool 文件似乎没有加载,我正在尝试诊断原因。但它们都不超过 11KB。
  • 您使用的是服务还是其他线程?也许您正在创建不止一个 SoundPool 或某个管理器的副本?我对你的描述的直觉反应是某物踩到了另一物的脚趾。这些文件的大小确实微不足道——这根本不是问题。我建议将您的问题作为自己的问题。这样你会得到更多的关注,并有机会更详细地解释(和提供代码)。
  • 斯科特,我可能会这样做,因为问题比这更复杂。我在原始评论中的唯一观点是,即使将小的 mp3 文件更改为 ogg 文件本身也不能解决问题,而将这些小资源用于他们自己的 MediaPlayer 对象可以解决问题。 (我会说,我认为在某些声音上设置连续循环可能会导致问题;希望我有更多的时间来调试它以确定……因此单独提出问题可能确实是一个好主意我有时间……)
【解决方案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 错误一无所知,因为我还没有研究过。

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多