Soundpool 无法播放最大流数

Soundpool doesn't play maximum number of streams

提问人:Selçuk Özer 提问时间:10/18/2022 最后编辑:Selçuk Özer 更新时间:10/20/2022 访问量:36

问:

我在我正在开发的游戏中使用声音池。它大部分时间都在弹奏钢琴音符,同时弹奏多个音符。在某些手机上,音符播放得非常好。另一方面,当我在另一部手机上进行测试时,有些音符无法播放。为了调查该问题,我编写了以下代码来了解问题的根源。有 85 个音符按顺序播放。当音符之间的延迟约为 1 秒时,音符播放良好,没有任何跳跃或延迟。这显示所有样本都加载完毕,没有任何错误。但是当我将延迟减少到 100 毫秒时,音符开始重叠,并且在以适当的方式依次播放几个音符后,声池停止并等待样本完成,然后再播放剩余的音符。另一方面,在另一部手机上,即使延迟为 100 毫秒,所有音符也能正常播放。由于最大流数为 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.lenght){
            handler.removeCallbacks(this);
        } else {
            handler.postDelayed(this, 100);
        }
            }
        };
        runnable.run();

编辑:在对问题进行了更多调查后,我注意到有些手机能够比其他手机同时播放更多的样本。在像我这样的钢琴应用程序中,如果有许多同时或重叠的演奏动作,我认为,使最大流数变大不是一个好主意,因为当达到最大容量时,声池会跳过演奏的音符。当最大值低于手机容量时,soundpool 不会跳过新声音,而是先停止已播放和最旧的流(如果它们的优先级相同)。这听起来对用户来说不那么令人不安。我通过将最大流数减少到 12 来解决这个问题。

Android SoundPool 同步

评论


答: 暂无答案