关于webAudio和domAudio的一点疑问

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本身的设计就是这样么,原理又是什么?

希望了解相关知识的大佬解释下,感谢:pray::pray::pray:

1赞

web audio 本身如此。

webAudio APi:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API

webAudio Example:
https://github.com/mdn/webaudio-examples

2赞

好的 感谢 @zzf_Cocos 那如果我想实现在android浏览器上用webAudio 在ios浏览器上用domAudio 可以通过修改源码实现么 我看load的时候是通过cc.AudioClip的_nativeAsset类型决定加载的 但是_nativeAsset这个如果是拖拽到场景中的音频设置成web以后 在运行的时候就不能在动态修改了啊

找到了一种:
修改audio-downloader.js的downloadAudio方法,判断如果是ios的话直接用loadDomAudio就可以了

再次感谢大佬

2赞

loadDomAudio怎么修改的啊,能说一下修改的代码么

不用改loadDomAudio只需要在downloadAudio优先判断下系统就可以了

2赞

谢谢,谢谢

楼主试成功了吗?我们在2.3.2上这么试,直接报音频加载失败

2.3以上没试过 不过应该是一样 我这里并没改逻辑的东西 直接把ios端写死成dom而已

2.4.3 处理方法
远程加载时
private loadRemote(url: string) {
return new Promise((resolve, reject) => {
cc.assetManager.loadRemote(this.setUrl(url), { audioLoadMode: cc.AudioClip[‘LoadMode’].DOM_AUDIO }, (err, res) => {
if (err) {
reject(err)
} else {
resolve(res)
}
})
})
}

无法使用远程加载的时候
if (cc.sys.os === cc.sys.OS_IOS && clip[‘loadMode’] === 0) {
clip[’_nativeAsset’] = new Audio(clip.nativeUrl)
}