HTML5中使用audio標籤遇到的兩個問題及解決方案

標籤是 HTML 5 的新標籤。標籤定義聲音,比如音樂各其它音頻流。公司的項目需要使用這個標籤。在使用的過程中遇到了兩個問題:一個是

部分手機瀏覽器無法實現自動播放(同樣也無法使用js控制實現自動播放),還有一個是部分瀏覽器audio標籤無法正常響應ended(播放結束)事件,無法獲取audio標籤的duration屬性的值

1、部分手機瀏覽器無法實現自動播放

這個現象產生的原因是:部分瀏覽器考慮了安全問題(偷跑流量),所以必須用戶交互後才能播放。知道了原因那麼自然就很好處理了。對於這個問題,網上大多處理方式都是先監聽用戶的DOM操作,如果事件響應了音頻還沒有播放,則播放音頻。而我們這邊的業務需求,需要一開始就獲取自動播放的權限(音頻是我們應用的一個關鍵功能),所以我們的處理方式是頁面開始就引導用戶點擊。

HTML5中使用audio標籤遇到的兩個問題及解決方案

用戶點擊“按鈕”才能進入內容頁面。這裡,用戶點擊之後才能使用我們服務。用戶點擊之後,我們也就獲取到了js控制自動播放的權限了。如果你們的業務需求無法使用以上方式在一開始就讓用戶點擊、獲取播放權限,而且音頻並非頁面加載完就必須播放(例如背景音樂之類的)。那麼可以先判斷一下當前瀏覽器是否支持自動播放,如果支持則頁面加載完立即播放音頻,如果不支持則監聽用戶的DOM操作再播放音頻。

HTML5中使用audio標籤遇到的兩個問題及解決方案

這裡我寫一個audioPlayPlugin.js,對audio標籤的常用操作進行了一些簡單的封裝。

2、部分瀏覽器audio標籤不正常響應ended(播放結束)事件,無法獲取audio標籤的duration屬性的值

因為業務需求,我必須監聽音頻的各種狀態(播放中timeupdate、暫停pause、播放結束ended、緩衝waiting)等,但是在部分手機瀏覽器(例如MIUI的系統瀏覽器)中監聽不了ended事件。也無法獲取audio標籤的duration屬性的值(如果能夠獲取duration屬性的值,就可以通過監聽timeupdate事件,判斷currrentTime和duration是否相等來模擬ended事件)。

起初看到資料說是 Response Headers的content-type屬性值為audio/x-mpeg導致的(瀏覽器不支持x-mpeg模式),把值設置為audio/mpeg即可。然而,找到後端說了這事兒,他弄了半天把content-type屬性值設為audio/mpeg,然而問題並沒有解決。

最後我做了一個測試,同一個音頻直接放在網站目錄下用相對路徑就可以正常監聽ended事件,也能正常獲取duration屬性值。生產環境我們的文件是在阿里雲上,使用絕對路徑。對比了一下headers信息,發現唯一不同的地方就是Status Code不同。能正常監聽的Status Code是206,不正常的是200。最後後端將音頻文件的返回方式調整為206後,問題成功解決。

總結一下:發生這個問題的原因是音頻類型文件請求的響應方式不對。其實默認的響應方式就是206,只是我們後端在設置文件響應方式的默認配置時,直接copy了一些配置文件,其實並不知道他修改了音頻文件的響應方式。


分享到:


相關文章: