前端实现页面自动播放音频方法

前提

需要页面自动播放一段报警声音,将audio标签的autoplay属性设置为true,发现自动播放失败,并出现如下报错:

Uncaught (in promise) DOMException: play() failed because the user didn’t interact with the document first.

为什么要禁止自动播放音频与视频

网页加载完成后立即播放音频(或带有音频轨道的视频)可能会意外地打扰到用户。尽管自动播放媒体文件是一个很实用的功能,但是我们也应该谨慎地使用它,保证只有在它被需要的时候才使用。为了让用户拥有控制权,通常浏览器会提供各种方式禁用自动播放音频功能。在这篇文章中,我们将介绍各种媒体和 Web Audio APIs 的自动播放功能,包括关于如何使用自动播放功能、如何优雅的处理阻止自动播放功能的一些简短的介绍。

Autoplay 功能

  据新政策,媒体内容将在满足以下至少一个的条件下自动播放:

  • 音频被静音或其音量设置为 0
  • 用户和网页已有交互行为(包括点击、触摸、按下某个键等等)
  • 网站已被列入白名单;如果浏览器确定用户经常与媒体互动,这可能会自动发生,也可能通过首选项或其他用户界面功能手动发生
  • 自动播放策略应用到<iframe>或者其文档上

  否则,播放可能会被阻止。导致播放被阻塞的确切情况以及将网站列入白名单的具体方法因浏览器而异,但最好是遵循以上的原则。

  详情,请参阅 Google Chrome 和 WebKit 的自动播放政策。

解决方案

  考虑到音频上可能还会有其他操作,选择第二种方案。如何知道自动播放失败了呢?其实自动播放失败时不会触发任何事件,也没有抛出异常或回调。那么便不能依赖autoplay。而是使用play函数模拟自动播放,play函数执行时会返回一个promise,可以根据promise来判断当前的播放是成功了还是失败了,并且在失败后做出相应的提示。

    // 页面加载事件中执行 this.playWarn()


    // 提示音弹窗,需要用户手动点一次才可以让浏览器播放音频
    applyPlayConfirm() {
      const audio = document.querySelector("audio");
      this.$confirm("请开启本次报警声音提醒", "提示", {
        type: "info",
        showClose: false,
        showCancelButton: false,
        closeOnPressEscape: false,
        closeOnClickModal: false,
        confirmButtonText: "确定",
        callback: () => {
          // 用户点击过后 即可播放
          audio.play();
        },
      });
    },

    // 申请播放音频,只需用户点击页面任意位置
    playWarn() {
      const audio = document.querySelector("audio");
      let startPlayPromise = audio.play();
      if (startPlayPromise !== undefined) {
        startPlayPromise
          .catch((error) => {
            if (error.name == "NotAllowedError") {
              this.applyPlayConfirm();
            } else {
              // Handle a load or playback error
            }
          })
          .then(() => {
            // Start whatever you need to do only after playback
          });
      }
    },

阅读:

MEI 媒体参与度索引

在以chorme为内核的浏览中,设置了MEI(Media Engagement Index)列表,该列表长度为1000,用来来衡量用户是否是该网站的“忠实用户”。当MEI排名足够高时,即可自动播放。

MEI衡量个人在网站上消费媒体的倾向。Chrome 当前的做法是每个来源的访问次数与重要媒体播放事件的比率

  • 媒体(音频/视频)的消耗必须大于7秒。
  • 音频必须存在且不能静音。
  • 带有视频的标签处于活动状态。(个人感觉是不能设置display: none, visibility: hidden等)
  • 视频大小(以px为单位)必须大于200x140

由此,Chrome计算出的媒体参与度得分在定期播放媒体的网站上足够高时,允许在桌面上自动播放媒体播放。

可以在chrome://media-engagement 内部页面上找到用户的MEI 。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本主题为更新的开心版dux3.0主题,默认需要PHP5.4或以上运行环境,如出现错误,自行切换PHP版本后刷新即可解决。不以空间或主机环境不支持为理由的退款。 DUX主题3.0版本更新内容: 全新的标签云(tags)页面 新增分类的SEO标题、SEO关键字和SEO描述 新增聚合文章小工具按浏览量排序的文章展示 新增链接分类可排序,按别名字母或数字从小到大排序,适用于主题中所有的链接调取 新增链接可排序,按评分从高到低排序,适用于主题中所有的链接调取 新增对WP4.8+小工具文本的可视化展示支持 新增对WP4.8+小工具音频、视频、图像的支持 修改站点设置中副标题为空时只显示站点标题 修改文章和页面自动描述(description)字数限制为200 修改标签页面的描述(description)为标签的图像描述 解决找回密码页面下拉可能发生的页面抖动 解决主题设置中图片地址参数被过滤的问题 解决搜索页面搜索框不显示的问题 去除主题设置中的360公共资源库引用 修改图片lazyload缩略图的判断方式 其他小问题的修复 DUX主题功能 SEO优化: 完美的基础SEO优化、首页关键字和描述自定义、文章关键字和描述的自定义 速度优化: 图片和头像lazyload按需异步加载提速、JS文件托管、jQuery可选底部加载 会员中心: 找回密码、登录、注册、找回密码 2种列表模式: 单图展示、无图展示 2种可选框架: 支持1栏和2栏 多种颜色: 14种可选颜色风格和自定义配色 独立页面: 读者墙、链接、存档、标签、网址导航 小工具: 网站统计、置顶文章、特别推荐、广告、文章列表(最新、随机、评论排行、分类下文章)、最新评论、标签云、搜索 直达链接: 在列表页和文章页都有展示,你可以选择开启、是否新窗口打开、是否需要加nofollow,甚至修改”直达链接“这几个字为你想要的 微分类: 选择一个分类作为微分类并使用不同的样式模版 分类url去除category字样: 整合了no-category插件,只需选择就行,无需再安装 列表无限加载: 可以设置无限加载页数和是否开启 手机端和非手机端广告: 可以设置不同平台的广告 不显示在首页: 可以设置一个或多个分类下的文章不显示在首页、可以设置一个或多个文章不显示在首页 社交账号展示: 微博、腾讯微博、微信(支持微信二维码展示)、订阅 文章小部件开启: 可选择开启:阅读量、列表评论数、列表作者名字前加网站名称 网站整体变灰: 这个不解释,不好的日子或许会用到 网页最大宽度: 你可以调整页面显示的宽度了,不过默认是很不错的 侧栏随动: 每种页面可设置不同的侧栏随动模块,首页、分类/标签/搜索页、文章页、页面可以不一样 广告位: 首页3个、文章页3个,分类页、标签页、搜索页,可设置各种广告自定义代码或联盟代码 自定义CSS样式: 添加自己的css样式 自定义头部和底部代码: 添加自己的头尾代码,如广告联盟等 网站统计代码位置 搜索结果高亮展示 后台编辑器的几个重要按钮 文章来源 焦点图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值