Android 关于SoundPool的内存问题

Android 关于SoundPool的内存问题,android,soundpool,Android,Soundpool,我知道SoundPool是用来处理类似fx的小声音的,我确保我想在某个序列中一个接一个播放的4个声音片段足够小 我使用了ogg质量的0,剪辑大小分别为35kb、14kb、21kb和23kb,总共有92kb的压缩音频。我不知道如何估计未压缩的大小,但它不应该很大,对吗 因此,当我按顺序播放4个声音时,它在前9次(9个序列x 4个声音)中运行良好,但在其中一个声音的9个序列中开始导致内存问题。当我开始看到错误时,总是序列9 最好的处理方法是什么?我有一些想法: 1) 进一步压缩声音(ogg质量-1,

我知道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) 不时释放并重新创建声音池实例

还有什么我能做的吗?令人尴尬的是,android api无法处理如此小的剪辑。我想知道人们是如何创造出有很多音效的游戏的

错误如下所示:

错误/AudioFlinger(35):内存不足,无法容纳音轨大小=1048640
DEBUG/MemoryDeler(35):有声曲目(0x25018,大小=1048576)

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


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

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

1) 将我的声音剪辑从44 kHz降低到22 kHz。未压缩的大小被减半(我计算了如何估计未压缩的声音大小-将剪辑导出为未压缩的wav)。我大胆地使用了不错的开源工具

2) 进一步调整声音以缩短持续时间


3) 放置try/catch around play()以防万一(它在尝试播放声音时会捕捉错误,但无法)

感谢您的响应…今天我对我的应用程序进行了更多测试,发现我使用soundpool循环的4种声音出现了问题。我加载了17个其他剪辑,它们工作正常,但在我的应用程序触发了4个循环剪辑中的一个之后,它崩溃了。我确实在创建活动时预加载了所有这些文件,而不是在其他地方。我将我的剪辑从44 kHz降到22 kHz,这有点帮助,但应用程序仍然因内存问题而崩溃。我需要播放ogg文件,所以我想JetBoy不是我的选择,但谢谢你的建议谢谢它对我有用。在此之前,我的声音文件被切断了。但我已经将m4a从44转换并重新采样到22,现在它可以正常工作而不会被切割。