(BUG)声音播放的 setFinishCallback 回调意外触发

版本:2.3.3
出现率:100%
测试环境:chrome浏览器
1.let id = cc.audioEngine.play(music, false);//music需要选一段比较长的音乐,方便测试
2.cc.audioEngine.setFinishCallback(id,()=>console.log(‘播放完成’));//给这个音乐加个播放完成的回调
3. setTimeout(() => {
cc.audioEngine.pause(id);
cc.audioEngine.resume(id)
},4000);//若干秒后进行pause,并且立即resume
5.结果会发现“播放完成”的日志被打出来了,也就是finish回调被触发了,而音乐实际上还在继续播放
6.这样做以后,我发现这个被误认为“finish“的音乐将会”泄露“,也就是浏览器失焦不再会自动暂停它的播放……

追加一条: cc.audioEngine.pause(id); 之后再进行cc.audioEngine.resumeAll() 并不能成功继续被暂停的这个音乐。
但是cc.audioEngine.pauseAll()之后再进行cc.audioEngine.resume(id)是可以正确地继续的……这很迷惑

我的测试环境是2.0.10

1.pause和resume源码中有对end事件进行解绑和绑定 猜测是这里的原因吧 我试了把这2个注释掉就正常了 但是具体原因不清楚 猜测可能是webAudio这样在一帧内设置会有问题 具体得还得官方解释 我的都是猜测

2.把音效改为domAudio在一帧内连续调用也不会有问题

最近在弄音效相关的东西,帮顶,持续关注~

是的 必须在同一帧(或者极短时间内?)里设置才会有这个bug;
我暂时的绕过方法是
cc.audioEngine.pause(id);之后
await dosomething;//由于这个await可能执行很快(我的场景是播放一个视频,但由于可能视频没成功加载,直接返回了false),才导致的bug;
//于是解决方法是:不过await多久结束,我都再额外等待1秒中再继续:
setTimeout(() => {cc.audioEngine.resume(id)},1000);//这样问题就解决了,finish不会回调

你好…请问一下 你说的源码 路径 是在哪…我也需要改这个…

@parv 看下这个文档
https://docs.cocos.com/creator/manual/zh/advanced-topics/engine-customization.html

感谢感谢感谢感谢感谢

官方能不能修复一下…这个bug

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。