Cocos Creator Oppo小游戏 播放多次会没声
Cocos Creator: 2.4.1
平台: Oppo 小游戏(Oppo mini game)
问题: 使用 cocos creator 自带的 audioEngine 去播放音效,在对同一个音效播放大概5,6次之后就会出现即使再次播放,也没有声音出现.
解决思路: 使用 Oppo 原生的 InnerAudioContext 这个类去播放音效. 按照文档的描述的限制规则去实现播放音效.
方案:
按着他这注意里面的思路实现.
我这里使用本地的音乐,暂时未选择使用加载远程音效,然后播放的策略,降低出现错误的风险,
我的游戏包是可以放得下音效文件,且音效文件不多
不过大致的思路是一致的
打包后资源带上了uuid + MD5 的前缀, 所以要先获取到这个 前缀才能正确的拼接路径, 播放指定的音效
// 通过打印这个 bundle 对象你会找到你想要的数据
cc.assetManager.loadBundle(bundleName, (err: Error, bundle: cc.AssetManager.Bundle) => {
let audioMap = bundle["_config"]["assetInfos"]["_map"];
for (let key in audioMap) {
let obj = audioMap[key];
if (!Data.audioConfig[obj["path"]]) {
let path = bundle["_config"]["base"] + "native/" + key.substr(0, 2) + "/" + obj["uuid"] + "." + obj["nativeVer"] + ".mp3"
//Data.audioConfig[obj["path"]] = path;
}
}
});
// 播放音效的实现
private dealMoreSameConfig: any = {};
playQgAudio(file: string, isLoop: boolean = false) {
if (Project.Platform != Platform.OPPO) return;
let audioObj = null;
if (!this.dealMoreSameConfig[file]) {
audioObj = qg.createInnerAudioContext()
audioObj.loop = isLoop
audioObj.volume = 1
audioObj.autoplay = false;
console.log("src ==> " , file, Data.audioConfig[file]);
audioObj.src = Data.audioConfig[file] //"audio/" + file + ".mp3"
this.dealMoreSameConfig[file] = audioObj;
var playSound = function() {
console.log("音效开始播放 : ", + audioObj.src);
audioObj.offCanplay(playSound)
}
audioObj.onCanplay(playSound)
} else {
audioObj = this.dealMoreSameConfig[file];
}
console.log("audio config ==> " , audioObj, audioObj.src);
audioObj.play()
}
使用的是ts 你可以翻译成js 他们俩个没啥太大的区别, 如果实在不懂,那就去理解一下ts语法.
好了, 拜拜,不多说.