play() failed because the user didn‘t interact with the document优化媒体不能自动播放

2023-09-14 22:07:59

1. 问题

谷歌浏览器 video 元素设置 autoplay,我们原意是希望页面加载时自动播放,但实际上并没有自动播放,在控制台报错如下:
Uncaught (in promise) DOMException: play() failed because the user didn’t interact with the document first.
这里的意思是,是因为用户没有先和网页交互所以播放失败。

2. 解析

首先去谷歌开发者文档查询下此类报错原因:

Autoplay Policy
Changes Chrome’s autoplay policies are simple:

  • Muted autoplay is always allowed.
  • Autoplay with sound is allowed if:
    • User has interacted with the domain (click, tap, etc.).
    • On desktop, the user’s Media Engagement Index threshold has been crossed, meaning the user has previously play video with sound.
    • On mobile, the user has added the site to his or her home screen.
  • Top frames can delegate autoplay permission to their iframes to allow autoplay with sound.

挑重点说,其实就是怕自动播放声音干扰到正常用户。

  1. Muted静音的自动播放是被允许的。
  2. 声音播放在以下几类中被允许:
    1. 用户和文档发生交互交互后,比如点击、触摸事件等。
    2. PC端在谷歌类浏览器设置的自动播放权限中设置允许自动播放。
    3. 移动端用户将站点作为首屏页面。
  3. frames内框分发自动播放权限给frames子内框。

3. 处理方案

1. 改浏览器自动播放权限

在不考虑其他终端运行时可以修改浏览器设置的自动播放权限:

  1. 在chrome浏览器中输入:chrome://flags/#autoplay-policy。
  2. Autoplay policy中将 Default 改为 No user gesture is required
  3. 重启Chrome。
    该方案最新的浏览器未找到,朋友们可以指正我的错误

2. 设置video标签属性muted静音,通过后续交互放开声音

muted 属性用于表示媒体元素是否静音。

<!--先在元素上分别设置自动播放和静音-->
<video id="video" src="/assets/video/1.mp4" autoplay muted />

<button id="btn" >播放声音</button>

<script>
const videoDom = document.getElementById('video');
const btnDom = document.getElementById('btn');

//	点击之后允许播放声音
btnDom.addEventListener('click', () => {
	videoDom.muted = false;
})
</script>

3. 使用AudioContext创建的对象自动播放(谷歌声音仍然受限)

AudioContext 接口表示由链接在一起的音频模块构建的音频处理图,逻辑我就不贴了,懒。

更多推荐

JDBC实现数据库批量插入

目录一、JDBC实现批量插入几种方式二、PreparedStatementaddBatch方法使用三、Statement和PreparedStatement区别使用Java数据库连接(JDBC)实现批量插入可以提高数据库操作的效率,特别是在需要一次性插入多条数据时。一、JDBC实现批量插入几种方式使用PreparedS

Redis中是如何实现分布式锁的?

分布式锁常见的三种实现方式:数据库乐观锁;基于Redis的分布式锁;基于ZooKeeper的分布式锁。本次面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的。要点Redis要实现分布式锁,以下条件应该得到满足互斥性在任意时刻,只有一个客户端能持有锁。不能死锁客户端在持有锁的期间崩溃而没有主动解锁,也

实战 | 服务端开发与计算机网络结合的完美案例

前言大家好,我是Martin后端,可以说是仅次于算法岗之外竞争最为激烈的岗位,而其中的服务端开发也是很多人会选择在秋招中投递的一个岗位,我想对于很多人来说,走上服务端开发之路的起点就是一个回声服务器了。今天带大家实战一把,真实体验服务端底层数据交换的点点滴滴,在这过程中可以让你看见TCP三次握手四次挥手的具体过程,全程

kafka 消费者的消费策略以及再平衡1

一kafka再平衡1.1kafka的再平衡Kafka的再平衡是consumer所消费的topic发生变化时,topic上的分区再次分配的情况。默认策略是Range+CooperativeSticky。Kafka可以同时使用多个分区分配策略。1.2kafka触发再平衡的情况1.consumergroup中的新增或删除某个

Microsoft 365跨平台协同办公功能,实现Mac、iOS、Windows用户的实时无缝协作

Microsoft365forMac(Office365)现已更新,最新版本的Microsoft365现已支持跨平台协同办公,接下来为你介绍一些使用office365Mac版进行创作及写作的好方法。Microsoft365在全平台共用相同的代码库,这意味着使用Mac、ios和Windows的365用户可以实现实时无缝协

在线记录学习笔记用哪一款工具?

及时将学习过程中的所感所想以笔记的形式记录下来是非常有必要的,不管是学生还是专业人士,都需要及时将学习笔记记录下来,支持在线记录学习笔记的工具用哪一款呢?很多人会直接使用大家所熟知的word或者txt文档来记事,传统的这种记笔记的方式虽然操作简单,且可以大窗口打开快捷记录,但是记录的笔记只能在一个设备上查看,要想实现在

实现表格表头自定义编辑、一键导入、增加列

1.前言本文基于vue2及elementUI的表格组件2.效果及功能展示3.需求背景有时候客户急需看到需求实现的页面,而此时后端接口没有,产品原型没有,只能前端出马,画一个静态页面,来展示客户想要的东西,如果是通过F12来改很慢,于是就有了这篇文章,使用它可以轻松的对表格的任何地方进行修改,且可以增加减少行或者列,它完

路由器ip地址设置

当你使用路由器时,你可以按照以下步骤设置路由器的IP地址。这样可以确保你的网络连接正常并允许其他设备连接到你的路由器。**步骤一:登录路由器管理界面**首先,你需要登录到路由器的管理界面。打开你的浏览器,并输入路由器的默认IP地址。常见的路由器默认IP地址包括192.168.0.1、192.168.1.1或192.16

7.idea 使用 docker 构建 spring boot 项目

本文目录step1:编写Dockerfile文件step2:pom.xml中添加如下配置step3:maven仓库setting.xml<servers>模块下,添加访问自定义仓库的用户名,密码step4:使用maven命令开始clean、packagestep5:使用mavendockerfile插件,推送镜像至本地

计算机网络层(2)

1.动态路由协议:内部网关协议:用于一个自治系统的内部外部网关协议:用于不同自治系统RIP协议(RoutingInformationProtocol,路由信息协议):路由信息协议是一种内部网关协议,是一种动态路由选择协议,通过要到达的主机需要经过的路由器的个数来判断网络的好换。rip协议认为:要到达对方主机所经过的路由

来自华为的暴击?传高通裁员赔偿N+7 | 百能云芯

自9月20日起,高通裁员的新闻在网络上持续发酵。尽管市场充满了关于裁员细节的传言,但截至目前,高通官方尚未对此发表评论。消息称,高通此次裁员的“重灾区”在上海的无线研发部门,甚至有传言称将直接关闭上海研发中心。裁员的补偿标准也备受关注,根据不同情况,高通将提供不同的补偿标准。多位网友在社交媒体上爆料称,高通上海研发部门

热文推荐