2.3.2版,多次播放cc.audioEngine.playEffect(audio, false)之后没有声音

  • Creator 版本:

  • 目标平台:

  • 详细报错信息,包含调用堆栈:

  • 重现方式:

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:

  • 额外线索:

audioEngine 一直存在bug,它本身是异步的,如果极短时间内有多次切换,多次播放之类的,必须中间做延迟,一般100ms延迟就够了,在这个延迟氛围内,禁用一切audioEngine操作,否则就会出各种诡异bug。

反馈过多次,一直未修复。

1赞

感谢 junlas 您的回复!我不知道怎么做才是好的,下面是我的测试代码,不成功。

    this.node.stopAllActions();
    let a =[];
    let canPlayEffect = true;
    let id;
    let time;
    for(let i=0;i<=20;i++){            
        a.push(cc.callFunc(()=>{
            if(canPlayEffect){
                log("i=",i);
                id = cc.audioEngine.playEffect(this.cardAudio[card3], false);
                let state = cc.audioEngine.getState(id);
                time = cc.audioEngine.getDuration(id);
                let currentTime = cc.audioEngine.getCurrentTime(id);
                log("playEffect id=",id,"state=",state,"time=",time,"currentTime=",currentTime);
                canPlayEffect = false;
                cc.audioEngine.setFinishCallback(id, ()=> {
                    log("playEffect Finish id = ",id);
                    canPlayEffect = true;
                });
            } else if(id != undefined) {
                let currentTime = cc.audioEngine.getCurrentTime(id);
                let state = cc.audioEngine.getState(id);
                log("stopEffect id=",id,"state=",state,"currentTime=",currentTime);
                //cc.audioEngine.setCurrentTime(id, time);
                //cc.audioEngine.stopAllEffects();
                cc.audioEngine.stopEffect(id);
                canPlayEffect = true;                    
            }                
        }));
        a.push(cc.delayTime(5));
    }
    this.node.runAction(cc.sequence(a));

下面是log:
i= 0
playEffect id= 0 state= 1 time= 0.6008163265306122 currentTime= 0
playEffect Finish id = 0
i= 1
playEffect id= 1 state= 1 time= 0.6008163265306122 currentTime= 0
playEffect Finish id = 1
i= 2
playEffect id= 2 state= 1 time= 0.6008163265306122 currentTime= 0
playEffect Finish id = 2
i= 3
playEffect id= 3 state= 1 time= 0.6008163265306122 currentTime= 0
playEffect Finish id = 3
i= 4
playEffect id= 4 state= 1 time= 0.6008163265306122 currentTime= 0
playEffect Finish id = 4
i= 5
playEffect id= 5 state= 1 time= 0.6008163265306122 currentTime= 0
stopEffect id= 5 state= 1 currentTime= 0.5979138321995521
i= 7
playEffect id= 6 state= 1 time= 0.6008163265306122 currentTime= 0
stopEffect id= 6 state= 1 currentTime= 0
i= 9
playEffect id= 7 state= 1 time= 0.6008163265306122 currentTime= 0
stopEffect id= 7 state= 1 currentTime= 0
i= 11
playEffect id= 8 state= 1 time= 0.6008163265306122 currentTime= 0

当id= 5 没有playEffect Finish的时候,下面继续播就没有声音了,不知道怎么解决.
已经做了很长等待 a.push(cc.delayTime(5));

我也遇到同样的问题,微信小游戏,在 2.2.2 上正常,升级到 2.3.3 之后多次播放没声音,而且只有在真机上会这样,浏览器里和模拟器里都是好的。把播放间隔调大到100ms确实就好了,但这样效果差很多。

奥,我的问题解决了,2.3.3版引擎中在这个CocosDashboard\resources.editors\Creator\2.3.3\resources\builtin\adapters\common\engine\AudioEngine.js 这个文件中配置了 cc.audioEngine._maxAudioInstance = 10; 就是同一个声音同时最多播放10个,以前是默认24。直接注释掉,或者在项目里设置把这个值改大 cc.audioEngine.setMaxAudioInstance(24); 问题就解决了。

2赞