DOM Audio
一般的浏览器都支持 Audio 标签的方式播放音频。引擎内的 DOM Audio 模式通过创建 Audio 标签来播放一系列的声音。但是在某些浏览器上可能会出现下列情况:
部分移动浏览器内,Audio 的回调缺失,会导致加载时间偏长的问题。所以我们尽量推荐使用 WebAudio。
iOS 系统上的浏览器,必须是用户主动操作的事件触发函数内,才能够播放这类型的音频。使用 javascript 主动播放可能会被忽略。
WebAudio
WebAudio 的兼容性比 DOM 模式好了不少,不过也有一些特殊情况:
iOS 系统上的浏览器,默认 WebAudio 时间轴是不会前进的,只有在用户第一次触摸并播放音频之后,时间轴才会启动。也就是说页面启动并播放背景音乐可能做不到。最好的处理方式就是引导用户点击屏幕,然后播放声音。
---------------------------------------------上面的是官方文档的介绍--------------------------------------------------
进入正题,目前在做web端时候遇到一个问题,在ios的设备上,如果用户把静音键打开了,那这个时候播放音频的话,如果是webAudio是没有声音的(在播没有出错可以正常结束)如果是domAudio的话就是正常的播放,有声音。
看了一下audio相关的代码发现dom模式的话 引擎是去创建了一个audio标签来播放音频的,而web模式则是利用AudioContext来播放的
所以目前有个疑问,为什么web模式下在静音状态不能正常发声呢,而dom就可以正常播放,是因为AudioContext本身的设计就是这样么,原理又是什么?
问题已经解决,修改引擎源码
罪魁祸首是settimeout,目前处理方案是针对微信平台直接callback.
https://forum.cocos.org/t/cocos-web-audio-dom-audio-ios/78331/6
因为部分手机加载dom audio有问题,无法进入游戏,如果需要直接加载可以按上面修改源码,也可以延迟加载,这样就可以进入游戏,这些处理都有问题,修改源码则升级时需要自己维护,而延迟加载则会导致有时显示不全从而无法操作,我觉得如果是背景音最好使用dom audio,最好用loader动态加载
哈喽..因为我自己很早就做了一套资源加载机制,所以我把音效都剥离到一个文件夹里,不影响我的其他资源和流程.
然后有问题的机型都是可以正常游戏,只是没有音效.
MP3解码兼容问题
之前遇到过一次这样的问题不过是在 ios 上, vivo 还是少见,遇到这种问题,一般是因为你选择的音频无法通过浏览器解码,我之前的解决方案是手动的将资源解码,使用工具是 Audacity
目前的推论是, vivo浏览器是拿开源的chromium来改的, 而mp3格式有些专利问题, 所以Chrome能解码的, chromium解不了. 在mp3的专利失效了之后, chromium就有mp3解码能力了,不过这个也得要vivo更新才行.