关于SoundPool的内存问题再次提问

5
我知道SoundPool是用来处理小的音效,而我也确保了我想要按顺序播放的四个音频片段都足够小。我使用了ogg质量0,这些片段分别是35kb、14kb、21kb和23kb,总共压缩后为92kb。我不知道它们未压缩的大小会有多大,但应该不会很大,对吧? 所以当我按顺序播放4段音频时,前9次(9个序列乘以4个音频)都可以正常播放,但在第9个序列的某个音频时开始出现内存问题。我总是在第9个序列开始时看到错误。 那么如何解决呢?我有几个想法: 1)进一步压缩声音(ogg质量-1,单声道代替立体声) 2)使用SoundPool.load和SoundPool.unload不断卸载和加载音频 3)定期释放并重新创建soundPool实例
还有其他什么方法吗?很尴尬的是,Android API甚至无法处理如此小的音频剪辑。我想知道人们是如何创造带有大量音效的游戏的...
错误信息如下: ERROR/AudioFlinger(35): not enough memory for AudioTrack size=1048640 DEBUG/MemoryDealer(35): AudioTrack (0x25018,size=1048576)
2个回答

2
似乎我解决了我的问题:
1) 将我的声音剪辑从44khz降到22khz。未压缩的大小减少了一半(我弄清楚了如何估算未压缩声音大小-将您的剪辑导出为未压缩wav)。我使用了一个不错的开源工具Audacity。
2) 对声音进行修剪,以减少持续时间。
3) 在play()周围放置try / catch,以防万一(当尝试播放声音但无法播放时会捕获错误)。

谢谢,这对我有用。在此之前,我的声音文件一直被切断。但是我已经将那个m4a从44转换并重新采样到22,现在它可以正常播放了。 - Shreyash Mahajan

0

这似乎很奇怪。SoundPool在加载音频剪辑时应该将其扩展到内存中,一旦加载完成,我不希望您在以后遇到内存问题。当我遇到内存问题时,通常是在开始时就出现了,而不是后来。您确定您没有在以后加载更多的声音吗?

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


谢谢回复...我今天测试了我的应用程序,发现问题出现在使用soundpool循环播放的4个声音上。我加载了其他17个片段,它们都正常工作,但是当我的应用程序触发其中一个循环的声音后,它就会崩溃。我在活动创建时预加载了所有片段,没有其他地方。我将我的片段从44降到22khz,这有所帮助,但应用程序仍然因内存问题而崩溃。 - mishkin
我需要播放OGG文件,所以我猜JetBoy对我来说不是一个选择,但感谢您的建议。 - mishkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接