当前位置: 首页 > Web前端 > HTML5

ios上的loadedmetadata事件只有在用户播放时才会触发,导致无法获取音频时长的问题

时间:2023-04-05 02:09:16 HTML5

需求背景H5页面的一组音频需要获取每段音频的时长,并显示在页面上。尝试使用音频对象。在canplay或者loadedmetadata的情况下,获取audio.durationaudioList.forEach((audioItem,index)=>{letaudio=newAudio(audioItem.voiceUrl)audio.onloadedmetadata=function(){console.log(audio.duration);}audio.oncanplay=function(){}audio.onerror=function(){console.log('audioLoadingfailed')}})浏览器没有问题,可以正常获取,但是打开后在ios手机上,发现只有手动触发audioplay事件后,才会打印duration解决方案。由于ios对音视频的一系列限制,包括提前加载和自动播放等,canpplay、loadedmetadata等音频事件只有在用户手动播放后才会触发。这时候就可以得到duration了。可以设置音频静音,然后在用户手动触发播放之前,使用代码触发播放事件来解决,但是要注意暂停如下audioList.forEach((audioItem,index)=>{letaudio=newAudio(audioItem.voiceUrl)audio.muted=trueaudio.play().then(()=>audio.pause();)audio.addEventListener('loadedmetadata',function(){console.log('音频加载成功',Math.round(audio.duration))})audio.muted=falseaudio.oncanplay=function(){}audio.onerror=function(){console.log('audioloadingfailed')}})tips虽然ios对音视频播放有限制,但是两者都是在静音的情况下(即通过设置muted=true)可以自动播放,所以可以想象,在自动播放的情况下,可以选择静音播放,给用户一个图标来开启声音,体验会更好。