【问题标题】:SoundPool error: no more track names availableSoundPool 错误:没有更多可用的轨道名称
【发布时间】:2012-01-13 08:31:18
【问题描述】:

我在使用 soundpool 类时遇到了问题。就是这样:

在我的游戏应用(顺便说一句,音乐应用)中,我需要同时再现至少 32 个短声音,所以我这样声明我的音池:

private SoundPool sp;
sp = new SoundPool(128, AudioManager.STREAM_MUSIC, 0);

之后,我加载了所有需要的 MP3 声音,大约 80 个声音,每个 55KB。我加载所有声音都没有问题,但速度很慢!好吧,这不是问题。真正的麻烦是当我同时播放大约 20 种声音时,我的日志中有一个错误:

ERROR/AudioFlinger(59): no more track names available
ERROR/AudioTrack(26349): AudioFlinger could not create track, status: -12
ERROR/SoundPool(26349): Error creating AudioTrack

之后,我尝试播放的每个声音都会引发相同的错误,并且无法播放任何声音。甚至没有另一个 Activity / soundpool 的声音。我不知道发生了什么或如何解决它!我应该更改声音文件的格式吗?播放声音后我应该释放内存还是什么?

(我在三星 Galaxy S I9000 上测试,2.3.3 OS 系统。应用是 2.1)

【问题讨论】:

  • 也许你需要实现 SoundPool.OnLoadCompleteListener ?
  • 为每个 AudioTrack 调用 release() ?
  • 确保没有启用循环模式,没有设置暂停的曲目,并且每个 mp3 真的像你想象的那么短(最后没有沉默)。由于可用的音轨数量有限,因此您必须将正在运行的音轨数量保持在较低水平。也许可用的曲目少于 32 首,因此您无法同时播放那么多声音。还有一些实现是错误的,并且可能会挂在某些轨道上(可能取决于坏的 mp3 文件或其他东西),因此可用的轨道很快就用完了。如果应用程序崩溃,有时轨道没有被释放,所以没有声音。

标签: android soundpool audiotrack


【解决方案1】:

this (in android group)

对于音频,每个设备 有 32 个活动 AudioTrack 对象的硬性限制(不是每个应用: 您需要与系统的其余部分共享这 32 个),

【讨论】:

    【解决方案2】:

    这里有几个想法。一:SoundPool 构造函数的第一个参数不是您要加载到其中的声音数量,而是您将要播放的同时流的最大数量。其次,SoundPool 的声音内存有限,大约 1MB。因此,如果您一次可以加载的曲目数量达到了一些未记录的限制,我一点也不感到惊讶。请注意,每个声音 80 个声音乘以 55k 肯定超过 1MB。该限制适用于将 mp3 解压缩为 SoundPool 中的音频数据之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多