需要背景

H5页面上一组音频,须要获取每个音频的时长,展现在页面上,尝试应用Audio对象,在canplay或者loadedmetadata事件中,获取audio.duration

audioList.forEach((audioItem, index) => {    let audio = new Audio(audioItem.voiceUrl)    audio.onloadedmetadata = function () {        console.log(audio.duration);    }    audio.oncanplay = function () {}    audio.onerror = function () {         console.log('音频加载失败')     }})

问题

在浏览器上是没有什么问题的,能够失常获取,然而在ios手机上关上之后,发现只有手动触发了audio的play事件后,才会打印出duration

解决办法

因为ios对audio和video的一系列限度,包含提前load和自动播放等,audio的canpplay,loadedmetadata等事件只有在用户手动的play之后,才会触发,此时能力获取duration,能够通过设置audio为静音,再在用户手动触发play之前,用代码触发play事件来解决,不过要留神暂停
如下

audioList.forEach((audioItem, index) => {    let audio = new Audio(audioItem.voiceUrl)    audio.muted = true    audio.play().then(() => audio.pause();)    audio.addEventListener('loadedmetadata', function () {      console.log('音频加载胜利', Math.round(audio.duration))    })    audio.muted = false    audio.oncanplay = function () {}    audio.onerror = function () {         console.log('音频加载失败')     }})

tips

尽管ios对audio和video的播放都有限度,然而在静音(也就是通过设置muted = true)的状况下这两者都是能够自动播放的,由此能够想到,在要求自动播放的状况下,能够抉择静音播放,给用户一个图标标识能够关上声音,体验会更好。