再次讲述SoundPool的内存问题

时间:2010-11-04 15:16:36

标签: android soundpool

我知道SoundPool旨在处理像声音这样的小fx,我确保我想要按顺序逐个播放的4个声音片段足够小。

我使用ogg质量0和剪辑是35kb,14kb,21kb和23kb,总计92kb的压缩音频。我不知道如何估计未压缩的大小,但它不应该很多,对吧?

因此,当我按顺序播放4个声音时,它在前9次(9个序列x 4个声音)中运行良好,但开始在其中一个声音的9个序列上引起内存问题。当我开始看到错误时,它始终是序列9。

处理这个问题的最佳方法是什么?我有一些想法:

1)压缩声音更多(ogg质量-1和单声道而不是立体声)

2)使用SoundPool.load和SoundPool.unload

不断地卸载和加载声音

3)从时间发布并重新创建soundPool实例时间

还有什么我可以做的吗?令人尴尬的是,android api无法处理如此小的剪辑。我想知道人们如何制作具有很多音效的游戏......

错误看起来像这样:

ERROR / AudioFlinger(35):没有足够的内存用于AudioTrack size = 1048640 DEBUG / MemoryDe​​aler(35):AudioTrack(0x25018,大小= 1048576)

2 个答案:

答案 0 :(得分:2)

我似乎能够在以下情况后解决我的问题:

1)我的声音片段从44到22khz下采样。未压缩的大小减少了一半(我想到了如何估计未压缩的声音大小 - 将剪辑导出到未压缩的wav)。我使用了很好的开源工具Audacity

2)更多地调整声音以减少持续时间

3)将try / catch放在play()以防万一(当它尝试播放声音时它确实捕获错误但不能)

答案 1 :(得分:0)

这看起来很奇怪。 SoundPool应该在加载时将音频片段扩展到内存中,一旦加载,我不希望你以后遇到内存问题。当我遇到内存问题时,它在开始时是正确的,而不是在以后。你确定以后没有加载更多声音吗?

要回答您的其他问题,有些游戏使用JET Player和MIDI声音而不是SoundPool。 Android SDK中的JetBoy示例程序是如何在应用程序中执行此类声音工作的一个很好的示例。