Chrome 聲音自動播放抱錯問題【play() failed】

来源:https://www.cnblogs.com/both-eyes/archive/2018/12/06/10078430.html
-Advertisement-
Play Games

Chrome下調用play後抱錯:DOMException: play() failed because the user didn't interact with the document first. 聲音無法自動播放這個在IOS/Android上面一直是個慣例,桌面版的Safari在2017年 ...


Chrome下調用play後抱錯:DOMException: play() failed because the user didn't interact with the document first.

聲音無法自動播放這個在IOS/Android上面一直是個慣例,桌面版的Safari在2017年的11版本也宣佈禁掉帶有聲音的多媒體自動播放功能,緊接著在2018年4月份發佈的Chrome 66也正式關掉了聲音自動播放,也就是說

<audio autopaly></audio> <video autoplay></video>

在桌面版瀏覽器也將失效。

最開始移動端瀏覽器是完全禁止音視頻自動播放的,考慮到了手機的帶寬以及對電池的消耗。但是後來又改了,因為瀏覽器廠商發現網頁開發人員可能會使用GIF動態圖代替視頻實現自動播放,正如IOS文檔所說,使用GIF的帶寬流量是Video(h264)格式的12倍,而播放性能消耗是2倍,所以這樣對用戶反而是不利的。又或者是使用Canvas進行hack,如Android Chrome文檔提到。因此瀏覽器廠商放開了對多媒體自動播放的限制,只要具備以下條件就能自動播放:

(1)沒音頻軌道,或者設置了muted屬性

(2)在視圖裡面是可見的,要插入到DOM裡面並且不是display: none或者visibility: hidden的,沒有滑出可視區域。

換句話說,只要你不開聲音擾民,且對用戶可見,就讓你自動播放,不需要你去使用GIF的方法進行hack.桌面版的瀏覽器在近期也使用了這個策略

對於網頁開發人員來說,應當如何有效地規避這個風險呢?

Chrome的文檔給了一個最佳實踐:先把音視頻加一個muted的屬性就可以自動播放,然後再顯示一個聲音被關掉的按鈕,提示用戶點一下打開聲音。對於視頻來說,確實可以這樣處理,而對於音頻來說,很多人是監聽頁面點擊事件,只要點一次了就開始播放聲音,一般就是播放個背景音樂。但是如果對於有多個聲音資源的頁面來說如何自動播放多個聲音呢?

首先,如果用戶還沒進行交互就調用播放聲音的API,Chrome會這麼提示:

DOMException: play() failed because the user didn't interact with the document first.

Safari會這麼提示:

NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

Chrome報錯提示最為友善,意思是說,用戶還沒有交互,不能調play。用戶的交互包括哪些呢?包括用戶觸發的touchend, click, doubleclick或者是 keydown事件,在這些事件裡面就能調play.

所以上面提到很多人是監聽整個頁面的點擊事件進行播放,不管點的哪裡,只要點了就行,包括觸摸下滑。這種方法只適用於一個聲音資源,不適用多個聲音,多個聲音應該怎麼破呢?這裡並不是說要和瀏覽器對著乾,“逆天而行”,我們的目的還是為了提升用戶體驗,因為有些場景如果能自動播放確實比較好,如一些答題的場景,需要聽聲音進行答題,如果用戶在答題的過程中能依次自動播放相應題目的聲音,確實比較方便。同時也是討論聲音播放的技術實現。

原生播放視頻應該就只能使用video標簽,而原生播放音頻除了使用audio標簽之外,還有另外一個API叫AudioContext,它是能夠用來控制聲音播放並帶了很多豐富的操控介面。調audio.play必須在點擊事件裡面響應,而使用AudioContext的區別在於只要用戶點過頁面任何一個地方之後就都能播放了。所以可以用AudioContext取代audio標簽播放聲音。

對於移動端開發可考慮用原生AudioContext,使用參考:https://juejin.im/post/5af7129bf265da0b8262df4c

對於瀏覽器pc網頁可以不用這麼麻煩,設置了muted屬性就可以繞過去,解決方案就是預設先加上muted標簽,要播放的時候先關掉靜音,再調用play方法播放就可以。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 編碼1(棧頂在最右) 練習如何使用數組來實現棧,綜合考慮使用數組的 push,pop,shift,unshift操作 基於代碼,實現如按鈕中描述的功能: 實現如閱讀材料中,隊列的相關進棧、退棧、獲取棧頂、判空的操作 棧頂對應數組中最後一個元素 進棧和退棧操作後,需要在 id 為 stack-cont ...
  • 一、HTML基本構造 <html>(告知瀏覽器其自身是一個HTML文檔) <head>(定義文檔的頭部) <title>這是網頁的標題</title>(定義文檔的標題) </head> <body>(定義文檔的主體) 這裡是網頁的內容 <p>這裡是一個文本段</p> </body> </html> ...
  • forEach是ES5中操作數組的一種方法,主要功能是遍曆數組,例如: 1 2 var arr = [1,2,3,4]; arr.forEach(alert); 1 2 var arr = [1,2,3,4]; arr.forEach(alert); 1 2 var arr = [1,2,3,4]; ...
  • 獲取滑鼠的位置信息: 1.e.clientX和e.clientY,滑鼠在瀏覽器視口中的坐標 2.e.pageX和e.pageY,滑鼠游標在頁面中的位置 3.e.screenX和e.screenY,滑鼠相對於整個屏幕的坐標信息 jquery計算元素的位置與寬高 1.obj.clientWidth和ob ...
  • HTML概述 一、HTML定義 HTML(HyperText Markup Language)超文本標記語言,寫給瀏覽器的語言,目前網路上應用最廣泛的語言。 目前已更新到HTML5,HTML添加了一些新的語義化標簽及新特性,放棄了一些就標簽。 主流瀏覽器:IE、Firefox、Chrome、Gool ...
  • 基本選擇器 1、通用元素選擇器 *表示應用到所有的標簽。 *{ padding:0px; margin:0px; } 2、元素/標簽選擇器 匹配所有p標簽的元素 p{ color:red; background:yellow; } 3、類選擇器 匹配所有class屬性中包含“起的類名”的元素。 語法 ...
  • #我的VUE框架學習 題記:初識VUE,覺得VUE十分的不錯,故決定去深入的瞭解學習它,工欲善其事,必先利其器,下麵是我搭建vue環境的過程! #一.項目搭建及初始化 1.安裝:node.js;去官網下載:https://nodejs.org/en/ 2.安裝cnp:mnpm install -g ...
  • 1.語法: var expression = /pattern/flags ; pattern: 任何簡單或複雜的正則表達式。 flags: 可以是 g,i,m 或它們的組合。 g:表示全局模式,即模式將被應用於所有字元串,而非在發現第一個匹配項時就立即停止。 i:表示不區分大小寫。 m:表示多行, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...