不同浏览器下 autoplay 的限制策略和方案的整理

智数航标
• 阅读 13561

不同浏览器下 autoplay 的限制策略和方案的整理

PC 端浏览器的限制策略 和 应对方案

使用 Mac 在 PC 端测试的浏览器包括

  • Chrome 浏览器
  • Safari 浏览器
  • Firefox 浏览器

Chrome 浏览器

Chrome-限制策略

内容参考自

2018 年 4 月份发布的 Chrome 66 正式关掉了声音自动播放

  • 静音自动播放总是允许的。
  • 在下列情况下允许使用声音自动播放:

    • 用户已经与域进行了交互(点击,tap 等)。
    • 在桌面上,用户的媒体参与指数阈值(MEI)已被越过,这意味着用户以前播放带有声音的视频。
    • 在移动设备上,用户已将该网站添加到主屏幕。
    • 顶部框架可以将自动播放权限授予其 iframe 以允许自动播放声音。

MEI 是一个评估用户对于当前站点的媒体参与程度的指数,它取决于


-   用户在媒体上停留时间超过了 7 秒以上
-   音频必须是展示出来,并且没有静音
-   与 video 之间有过交互
-   媒体的尺寸不小于 200x140.
Chrome-应对方案
  • 1.不要假设视频会播放,并且在视频不是真正播放时不要显示暂停按钮。
  • 2.根据 promise 结果,判断当前媒体是否支持 autoplay
var promise = document.querySelector("video").play();

if (promise !== undefined) {
    promise
        .catch(error => {
            // Auto-play was prevented
            // Show a UI element to let the user manually start playback
        })
        .then(() => {
            // Auto-play started
        });
}
  • 3.如果不支持,有 3 个选择,

    • (1)静音自动播放,
    • (2)或者选择弹出 dialog 引导用户产生一次交互,在 event 回调里调用 play()
    • (3)提高 Chrome 浏览器的 MEI 指数

Safari 浏览器

Safari 的限制策略和应对方案

内容参考自
https://webkit.org/blog/7734/...

Safari 浏览器使用自动推理引擎来阻止绝大多数网站默认自动播放的媒体元素。

Safari11 允许用户通过「此网站的设置」选项,让用户控制哪些网站可以自动播放音视频

  • 1.判断当前媒体是否支持 autoplay
  • 2.如果不支持,有 3 个选择

    • 静音自动播放
    • 引导用户对浏览器设置为【允许自动播放】
    • 弹出 dialog 引导用户产生一次交互,在 event 回调里调用 play()

静音自动播放例子:

不同浏览器下 autoplay 的限制策略和方案的整理

弹出 dialog 引导用户产生一次交互的例子:
不同浏览器下 autoplay 的限制策略和方案的整理

引导用户对浏览器设置为【允许自动播放】的例子:

不同浏览器下 autoplay 的限制策略和方案的整理

不同浏览器下 autoplay 的限制策略和方案的整理

Firefox 浏览器

个人测试的结果是 Firefox 浏览器支持 autoplay

移动端浏览器的限制策略 和 应对方案

使用 Android 手机测试的浏览器包括以下

  • Firefox / QQ 浏览器 / 钉钉
  • 微信
  • Chrome
  • Safari
  • UC浏览器

其中 Firefox / QQ 浏览器 / 钉钉 使用 video autoplay 的表现良好

微信的限制策略和应对方案

微信上实现自动播放需要用到一个 API WeixinJSBridge

它是在微信内置浏览器中有一个内置的 JS 对象,这个内置的 JS 对象就是 WeixinJSBridge. WeixinJSBridge 并不是 WebView 一打开就有了,客户端需要初始化这个对象,当这个对象准备好的时候,客户端会抛出事件 "WeixinJSBridgeReady"。因此,在调用 WeixinJSBridge 相关 api 时,需要做好 WeixinJSBridge 存在与否的判断.

//监听 WeixinJSBridge 是否存在
if (
    typeof WeixinJSBridge == "object" &&
    typeof WeixinJSBridge.invoke == "function"
) {
    vedio.play();
} else {
    //监听客户端抛出事件"WeixinJSBridgeReady"
    if (document.addEventListener) {
        document.addEventListener(
            "WeixinJSBridgeReady",
            function() {
                vedio.play();
            },
            false
        );
    } else if (document.attachEvent) {
        document.attachEvent("WeixinJSBridgeReady", function() {
            vedio.play();
        });
        document.attachEvent("onWeixinJSBridgeReady", function() {
            vedio.play();
        });
    }
}
移动端 Chrome 的限制和解决方案
  • muted可以自动静音播放
  • 引导用户做一次交互可以播放
  • MEI值高的网站,可以自动播放
移动端 Safari 的限制和解决方案
  • muted可以自动静音播放
  • 引导用户做一次交互可以播放
  • 引导用户对浏览器设置为【允许自动播放】
移动端 UC浏览器 的限制和解决方案
  • 静音模式也无法自动播放
  • 弹出dialog,引导用户做一次交互可以播放

音频的限制策略和应对方案

参考资料

https://segmentfault.com/a/11...

音频元素

原生播放音频除了使用audio标签之外,还有另外一个API叫AudioContext,AudioContext接口表示由音频模块连接而成的音频处理图,每个模块对应一个AudioNode。AudioContext可以控制它所包含的节点的创建,以及音频处理、解码操作的执行。做任何事情之前都要先创建AudioContext对象,因为一切都发生在这个环境之中。

AudioContext播放声音
  1. 先请求音频文件,放到ArrayBuffer里面,然后用AudioContext的API进行decode解码,解码完了再让它去play。
function request (url) {
    return new Promise (resolve => {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        // set response Type arraybuffer
        xhr.responseType = 'arraybuffer';
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                resolve(xhr.response);
            }
        };
        xhr.send();
    });
}
  1. 实例化AudioContext
// Safari是使用webkit前缀
let context = new (window.AudioContext || window.webkitAudioContext)();
  1. 解码播放
function play (context, decodeBuffer) {
    let source = context.createBufferSource();
    source.buffer = decodeBuffer;
    source.connect(context.destination);
    // 从0s开始播放
    source.start(0);
}
// 请求音频数据
let audioMedia = await request(url);
// 进行decode和play
context.decodeAudioData(audioMedia, decode => play(context, decode));
点赞
收藏
评论区
推荐文章
芝士年糕 芝士年糕
2年前
什么是跨域
域: 是指浏览器不能执行其他网站的脚本跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 
Python进阶者 Python进阶者
4年前
手把手教你使用CSS3为文本和元素实现添加阴影效果
使用CSS3,你可以为文本和元素添加阴影。一、浏览器支持表中的数字指定完全支持该属性的第一个浏览器版本。数字后面的webkit或者moz使用时需要指定前缀。|属性|Chrome|Firefox|Safari|Opera|IE|||||||||text
Stella981 Stella981
3年前
Python+Selenium自动化
PythonSelenium自动化安装模块和浏览器驱动操作方法1.安装模块文件pipinstallselenium2.安装浏览器驱动我们主要用的浏览器驱动有chrome浏览器、f
Stella981 Stella981
3年前
CentOS 7 环境下 chromedriver 安装
chrome和chromedriver如果没有安装过chrome浏览器,那么下边安装chrome命令安装浏览器。在命令行输入googlechromeversion查看chrome浏览器的版本,在下网站中进行比对。获取当前chrome适配的chromedriver版本。解压到/data/a
Stella981 Stella981
3年前
Chrome headless 模式
把自动化测试的运行放在后台:PhantomJS非常不错,因为是使用的QtWebKit浏览器内核渲染页面,基本可以和真正浏览器保持一致。Chromeheadless模式,Google针对Chrome浏览器59版新增加的一种模式,可以让你不打开UI界面的情况下使用Chrome浏览器,所以运行效果与Chrome保持完美一致。P
Stella981 Stella981
3年前
Selenium使用及原理
1、Selenium介绍Selenium是一个Web测试工具,通过直接控制浏览器来实现Web测试,与真实用户操作完全一致。Selenium目前支持IE、Firefox、Chrome、Safari、Opera等浏览器,Selenium支持主流的操作系统平台Windows、Linux、Mac等,Selenium支持Java、Ruby、Python
Stella981 Stella981
3年前
Selenium3自动化测试【13】FireFox与Chrome浏览器元素定位
目前大部分浏览器都内置了相关插件或组件,能够帮助我们快速、简洁地展示各类元素的属性定义、DOM结构、CSS样式等属性。本书中使用的浏览器主要是FireFox、Chrome(这2款浏览器也是作为开发者常用的浏览器),因此本节介于这2款浏览器一起看看这些工具(组件)的使用方法。火狐(FireFox)浏览器如果大家对火狐浏览器较为熟知,在旧版本上的
ZOS对象存储跨域资源访问的实现和使用
跨域指的是从一个域名去请求另外一个域名的资源,即跨域名请求。跨域时,浏览器不能执行其他域名网站的脚本,这是由浏览器的同源策略造成的,是浏览器施加的安全限制。同源策略是一种约定,是浏览器最核心也最基本的安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这是一个用于隔离潜在恶意文件的重要安全机制。
子桓 子桓
2年前
浏览器脚本管理分享
Tampermonkey是一款浏览器扩展程序,可用于管理用户自定义的JavaScript脚本。该扩展程序支持多种浏览器,包括Chrome、Firefox、Safari、Edge等。使用Tampermonkey,用户可以轻松地安装、管理和运行自定义的Java
liam liam
1年前
解决 Axios 跨域阻碍,提高前端接口访问效率
跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用XMLHttpRequest和Fetch请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对施加的安全限制。Axios跨域常见报错跨域请求被阻止(CrossOriginRe
API 小达人 API 小达人
1年前
5分钟上手 浏览器插件测试——Eolink Apikit
EolinkApikit研发管理和自动化测试产品中,提供了多种发起API测试的方式,包括浏览器插件测试。通过EolinkApikit官方浏览器插件发送请求,需要安装Chrome或者Firefox插件,可访问本地服务器(localhost)、内网、局域网。
智数航标
智数航标
Lv1
月落乌啼霜满天,江枫渔火对愁眠;
文章
5
粉丝
0
获赞
0