使用 Mac 在 PC 端測試的瀏覽器包括git
Chrome-限制策略
內容參考自github
2018 年 4 月份發佈的 Chrome 66 正式關掉了聲音自動播放web
在下列狀況下容許使用聲音自動播放:macos
MEI 是一個評估用戶對於當前站點的媒體參與程度的指數,它取決於segmentfault
- 用戶在媒體上停留時間超過了 7 秒以上 - 音頻必須是展現出來,而且沒有靜音 - 與 video 之間有過交互 - 媒體的尺寸不小於 200x140.
Chrome-應對方案
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 個選擇,api
Safari 的限制策略和應對方案
內容參考自
https://webkit.org/blog/7734/...promise
Safari 瀏覽器使用自動推理引擎來阻止絕大多數網站默認自動播放的媒體元素。瀏覽器
Safari11 容許用戶經過「此網站的設置」選項,讓用戶控制哪些網站能夠自動播放音視頻微信
2.若是不支持,有 3 個選擇框架
靜音自動播放例子:
彈出 dialog 引導用戶產生一次交互的例子:
引導用戶對瀏覽器設置爲【容許自動播放】的例子:
我的測試的結果是 Firefox 瀏覽器支持 autoplay
使用 Android 手機測試的瀏覽器包括如下
其中 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 的限制和解決方案
移動端 Safari 的限制和解決方案
移動端 UC瀏覽器 的限制和解決方案
參考資料
https://segmentfault.com/a/11...
原生播放音頻除了使用audio標籤以外,還有另一個API叫AudioContext,AudioContext接口表示由音頻模塊鏈接而成的音頻處理圖,每一個模塊對應一個AudioNode。AudioContext能夠控制它所包含的節點的建立,以及音頻處理、解碼操做的執行。作任何事情以前都要先建立AudioContext對象,由於一切都發生在這個環境之中。
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(); }); }
// Safari是使用webkit前綴 let context = new (window.AudioContext || window.webkitAudioContext)();
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));