微信浏览器h5 loadedmetadata 兼容性问题

本文探讨了如何在微信浏览器中正确使用`loadedmetadata`和play/pause事件获取视频时长,以及针对iOS限制的音频策略。通过实例代码展示了在不同环境下处理音频和视频时长获取的问题与解决方法。

需求:h5页面需要做一个上传视频并且获取视频的时长

1,使用loadedmetadata这个是函数,当指定的音频/视频的元数据已加载时,会发生 loadedmetadata 事件

``

 let audioElement = new Audio(url), self = this,result;
       audioElement.addEventListener("loadedmetadata", function() {
         result = audioElement.duration
         let time = parseInt(result)
       });

这种获取视频的时长在其他浏览器都可以获取到视频的时长,但是在微信浏览器打开就不行
2.由于ios对audio和video的一系列限制,包括提前load和自动播放等,所以只有当audio的play触发事件,才可以监听到duration,所以我们需要默认触发play事件,播放音频,但是注意的需要及时暂停

 let audioElement = new Audio(url), self = this,result;
          audioElement.muted = true
          audioElement.play().then(()=>audioElement.pause())
          audioElement.addEventListener("loadedmetadata", function() {
            result = audioElement.duration
            let time = parseInt(result)
            audioElement.muted = false
            self.$emit('getFilesData',o,time)
          });
<!DOCTYPE html> <html> <head> <title>HLS.js 播放 M3U8</title> <!-- 引入 HLS.js 库 --> <!-- <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script> --> <script src="~/content/videoplayer/m3u8/hls.js"></script> </head> <body> <div>使用 HLS.js 原生实现(推荐)</div> <video id="hlsVideo" controls width="800" height="450" muted autoplay></video> <script> const video = document.getElementById('hlsVideo'); const m3u8Url = '/content/videoplayer/m3u8/demovideo/logo3/logo3.m3u8'; if (Hls.isSupported()) { // 检测浏览器支持性 const hls = new Hls({ maxBufferLength: 30, // 最大缓冲长度(秒) maxMaxBufferLength: 60, // 绝对最大缓冲 enableWorker: true, // 启用WebWorker pLoader: (context) => { if (context.url.includes('.ts')) { const baseUrl = context.url.split('?')[0]; const newUrl = baseUrl.replace('.ts', ''); context.url = newUrl; } return Hls.DefaultConfig.loader(context); } }); // if (hls) { // hls.destroy(); // hls = null; // } hls.config.debug = true; //启用调试日志 // 配置请求拦截器 // hls.config.pLoader = (context) => { // // 修改TS文件的URL,可以添加token、时间戳等参数 // if (context.url.endsWith('.ts')) { // const url = new URL(context.url); // url.searchParams.append('token', 'your-dynamic-token'); // url.searchParams.append('timestamp', Date.now().toString()); // context.url = url.toString(); // } // return new Hls.DefaultConfig.loader(context); // }; // hls.config.pLoader = (context) => { // if (context.url.endsWith('.ts')) { // // 使用URL重写而非添加参数 // const originalUrl = context.url; // const baseUrl = originalUrl.substring(0, originalUrl.lastIndexOf('/')); // const segmentName = originalUrl.substring(originalUrl.lastIndexOf('/') + 1); // // 重写为无扩展名路径 // context.url = `${baseUrl}/segment-${segmentName.replace('.ts', '')}`; // } // return hls.createLoader(context); // }; hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED, () => { video.play().catch(e => { console.log(`播放失败: ${e.message}`); }); console.log('媒体解析完成,开始播放'); }); hls.on(Hls.Events.ERROR, (event, data) => { handleHlsError(data); }); hls.loadSource(m3u8Url); //加载视频源 video.controls = true; // 错误处理 hls.on(Hls.Events.ERROR, (event, data) => { console.error('HLS 错误:', data); }); } else if (video.canPlayType('application/vnd.apple.mpegurl')) { // Safari 原生支持 HLS video.src = m3u8Url; video.addEventListener('loadedmetadata', () => { video.play(); }); } else { alert('当前浏览器不支持 HLS 播放'); } // 错误处理函数 function handleHlsError(data) { let errorMsg = '播放错误: '; if (data.fatal) { switch (data.type) { case Hls.ErrorTypes.NETWORK_ERROR: errorMsg += `网络错误(${data.details})`; hls.startLoad(); // 网络中断后重连 break; case Hls.ErrorTypes.MEDIA_ERROR: errorMsg += `媒体错误(${data.details})`; hls.recoverMediaError(); // 媒体错误恢复 break; default: errorMsg += `致命错误(${data.details})`; loadVideo(hls.url); // 重新加载 break; } } else { errorMsg += `非致命错误(${data.details})`; } console.log(errorMsg); } </script> </body> </html> 请修复这里无法打开video的BUG,并给出完整的代码
最新发布
10-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值