SoundPool无法按最大流数播放问题的排查与解决
SoundPool多钢琴音符播放的设备兼容性问题解决
问题现象
开发的游戏使用SoundPool实现多钢琴音符同时播放,部分设备运行正常,但在某台设备上出现部分音符无法播放的情况。
测试验证
编写测试代码排查:
- 以1秒间隔依次播放85个音符,全程无卡顿,确认所有音频采样加载正常
- 将播放间隔缩短至100ms后,音符开始重叠播放,播放若干个后SoundPool会等待已有采样播放结束才继续播放剩余音符;但另一台设备在100ms间隔下可正常播放所有音符
- 已设置SoundPool最大流数为100,理论上支持同时播放所有音符,且运行时内存无过载情况
测试代码
spl=new SoundPool(100, AudioManager.STREAM_MUSIC, 0); Handler handler = new Handler(); Runnable runnable = new Runnable() { int cnt1=0,cnt2=0; @Override public void run() { cnt1=cnt1+1; if (cnt1>10){ stream=spl.play(sndIds[cnt2],volumesToBePlayed.get(i), volumesToBePlayed.get(i),1,0,1f); Log.i("playing", String.valueOf(cnt2) + " " + String.valueOf(stream)); cnt1=0; cnt2=cnt2+1; } if(cnt2>= sndIds.length){ handler.removeCallbacks(this); } else { handler.postDelayed(this, 100); } } }; runnable.run();
排查与解决方案
- 核心原因:不同设备硬件支持的同时播放音频采样数存在差异
- 针对钢琴类应用的优化思路:设置过大的最大流数并不合理——当达到设备实际承载上限时,SoundPool会直接跳过新音符;若设置的最大流数低于设备承载量,SoundPool会优先停止最早播放的同优先级流,对用户听觉体验的干扰更小
- 最终解决:将SoundPool最大流数调整为12后,目标设备上的音符播放恢复正常
内容的提问来源于stack exchange,提问作者Selçuk Özer
相关产品推荐
相关产品推荐

