Loading

Cocos Creator Oppo小游戏 播放多次会没声

Cocos Creator: 2.4.1
平台: Oppo 小游戏(Oppo mini game)

问题: 使用 cocos creator 自带的 audioEngine 去播放音效,在对同一个音效播放大概5,6次之后就会出现即使再次播放,也没有声音出现.

解决思路: 使用 Oppo 原生的 InnerAudioContext 这个类去播放音效. 按照文档的描述的限制规则去实现播放音效.

oppo api 传送门

方案:

按着他这注意里面的思路实现.
我这里使用本地的音乐,暂时未选择使用加载远程音效,然后播放的策略,降低出现错误的风险,
我的游戏包是可以放得下音效文件,且音效文件不多
不过大致的思路是一致的

打包后资源带上了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语法.

好了, 拜拜,不多说.

posted @ 2020-09-28 11:16  丫丫魏  阅读(677)  评论(0编辑  收藏  举报