浏览器的自动播放策略
策略详情:
Chrome的自动播放政策很简单: 1、始终允许静音自动播放 2、在以下情况下,带声音的自动播放会被允许 2.1、用户已经与当前页面进行了交互(click、tap) 2.2、在桌面设备上,用户的媒体参与度指数阈值已超过,这意味着,用户之前播放过有声视频 2.3、用户已经将网站添加到移动设备上的主屏幕或在桌面安装了PWA(这个你可以忽略了!) 3、顶部帧可以将自动播放权限委派给其 iframe,允许自动播放声音
复制
媒体参与度,是什么?
媒体参与度(MEI),衡量个人在网站上使用多媒体的倾向, 它是一个数字,可以通过 chrome://media-engagement/ 查看, 数值越高,用户对该站点的媒体参与度越高,就越有机会自动播放 对于开发者而言,媒体参与度的计算规则,无法通过技术手段更改
复制
开发者最佳实现:
方案1:互动后播放 先尝试自动播放,如果发生异常,则引导用户进行交互动作,然后再进行播放 方案2:互动后出声 先静音播放,然后根据,是否能自动播放,决定是否取消静音,如果: 1、能自动播放,取消静音 2、不能自动播放,引导用户进行互动操作后,取消静音
复制
代码示例
,把.MP4
文件换掉后,直接浏览器运行这个.html
文件,就能看到效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>浏览器的自动播放策略</title> </head> <style> /* 视频容器样式 */ .vdo-container { position: relative; width: 640px; height: 200px; background: pink; margin: 60px auto; } /* 视频样式 */ video { height: 200px; } /* 模态框样式 */ .modal { width: 640px; height: 200px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: rgba(0, 0, 0, 0.4); color: white; padding: 10px 20px; border-radius: 5px; display: none; /* 默认不显示 */ align-items: center; justify-content: center; } /* 按钮样式 */ .btn { padding: 10px 20px; background-color: #4CAF50; /* 绿色 */ border: none; color: white; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 5px; } /* 鼠标悬停按钮效果 */ .btn:hover { background-color: #45a049; } </style> <body> <div class="vdo-container"> <video src="./test.mp4"></video> <div class="modal"> <button class="btn">开始播放</button> </div> </div> </body> <script> const vdo = document.querySelector("video") const modal = document.querySelector(".modal") const btn = document.querySelector(".btn") function play() { vdo.muted = true // 静音 vdo.play() /* 创建一个新的音频上下文, AudioContext 是 Web Audio API 的一部分, 它提供了一个音频处理环境,你可以在其中创建和修改音频数据 */ const ctx = new AudioContext() /* const canAutoPlay = ctx.state === 'running',的意思是:检查 AudioContext 的状态是否为 running, 如果为running,则表示,音频上下文已经成功创建并运行, 这意味着,浏览器允许自动播放音频和视频。 */ const canAutoPlay = ctx.state === 'running' /* 关闭AudioContext, 因为,在这个函数中,你只检查其状态,并不进行其他音频处理, 所以,立即关闭它是合理的。 */ ctx.close() if (canAutoPlay) { /* 如果 canAutoPlay 为 true(即浏览器允许自动播放) vdo.muted = false:取消视频的静音状态, 既然视频已经开始播放,并且,没有遇到自动播放的问题,那么可以取消静音,让用户听到视频的声音。 */ vdo.muted = false modal.style.display = 'none' // 从按钮上移除play函数的点击事件监听器,因为视频已经开始播放,所以不需要再监听这个按钮的点击事件。 btn.removeEventListener('click', play) } else { // 如果 canAutoPlay 为 false(浏览器不允许自动播放) // modal.style.display = 'flex':显示模态框,目的就是为了让用户点一下,用户和浏览器交互后,就能播放声音了 modal.style.display = 'flex' btn.addEventListener('click', play) } } play() </script> </html>
复制