Audio在移動端的兼容性問題(1)

一直想開通一個blog,但是由于工作太忙(此處寫給領導看),還有自己的有三個原因,一是懶,二是懶,三是懶,把這個事情耽擱了,然后直到今天。

那我們直接進入今天的主題。因為最近廣告項目里面有個需求,要在移動端用web的HTML5中的Audio來實現音頻播放。之前做過PC端的音頻播放器,移動端的接觸的不是很深入。然后我跌入了一個接一個的坑,在這里我做個記錄,種棵樹給后面的人乘涼~

需求

做一個SPA的web互動測試游戲。題目是自動切換播放的音頻,根據音頻內容選擇正確選項。

兼容移動端的微信,APP,瀏覽器和PC端的主流瀏覽器。

準備

第一步,我們先查看兼容性,打開Can I Use,CanIUse提供了各種瀏覽器所能支持的桌面和移動端網絡前端Web技術,可以提高網站開發人員的工作效率(官方解釋哈,不過這個工具確實不錯,建議收藏)。

下面是關于audio兼容性圖表:

compatibility

可以看到,在移動端上用Audio是完全可行的(理論上是這樣,實際操作你們懂的)。

第二步,我們查看下的開發文檔關于Audio標簽的描述。

event
function
property

入坑

基礎的就不多說了,前端采用zepto.js框架,實現的一個單頁面測試,后端用了thinkphp框架,調用了微信獲取用戶信息接口等,數據庫采用的是MySql。

問題

1.音頻自動播放問題;2.音頻預加載的問題;3.多個音頻文件切換問題;4音頻文件暫停和播放操作間隔時間問題;

audio-property

今天我們只說音頻控件,對于視頻控件后面整理。上面的圖片展示了音頻標簽的屬性,pc端主流瀏覽器下,這些屬于都是支持的,BUT!移動端有的就扯蛋了~

1.音頻自動播放問題;

這是我在PC端的谷歌模擬器下調試成功后,移動端調試遇到的第一個問題。PC端耍的好好的,到手機上突然沒了聲音,這尼瑪好蛋疼,好想罵娘,突然感覺到人生好艱難~~~但是再難也要走下去,平復心情,解決問題~~在網上查了資料后,這個問題能夠解決,但是無法完美。

關于音頻自動播放屬性autoplay的問題,目前分為三大類:

一,支持audio的autoplay,大部分安卓手機的自帶瀏覽器和微信(無需特殊處理);

二,不支持audio的autoplay,部分的IOS手機的微信(解決方案下面提供);

三,不支持audio的autoplay,部分的安卓手機的自帶瀏覽器(比如小米)和全部的IOS safari瀏覽器(這種只能做用戶觸屏時觸發播放了)。

以前的IOS是支持音頻自動播放的,但是在IOS4.2.1版本之后,蘋果不支持自動播放,網上查了下發現IOS上禁止了Audio的Autoplay屬性,原因如下:

User Control of Downloads Over Cellular Networks

In Safari on iOS (for all devices, including iPad), where the user may be on a cellular network and be charged per data unit, preload and autoplay are disabled. No data is loaded until the user initiates it. This means the JavaScript play() and load() methods are also inactive until the user initiates playback, unless the play() or load() method is triggered by user action. In other words, a user-initiated Play button works, but an onLoad="play()" event does not.

OK,找到問題根源了,我們開始入手解決,安卓端主流手機都支持,所以不需要處理;IOS微信里面不能自動播放,微信做了很好的支持,調用微信的“WeixinJSBridgeReady”方法;IOS的safari瀏覽器下,只有用觸屏播放的變通方法處理了。代碼如下:

functionaudioAutoPlay(id){

varaudio?=?document.getElementById(id),

play?=function(){

audio.play();

document.removeEventListener("touchstart",play,false);

};

audio.play();

document.addEventListener("WeixinJSBridgeReady",function()?{

play();

},false);

document.addEventListener('YixinJSBridgeReady',function()?{

play();

},false);

document.addEventListener("touchstart",play,false);

}

audioAutoPlay('myAudio');

2.音頻預加載的問題;

IOS Safari 中和微信是不支持preload屬性的,和autoplay一樣。我靠!要你們有啥用~

即便是 HTML markup中使用了preload屬性,IOS仍會忽視此屬性,并且不會加載此文件,除非由用戶觸摸事件觸發(這樣很low)。

3.多個音頻文件切換問題;

因為測試的每到題目都涉及到一個音頻文件播放,IOS下面音頻切換出現了播放不了的問題。

一開始我的頁面結構如下:

音頻切換問題代碼

我把整個Audio進行了循環,PC和安卓上,這種方式是都可以播放的,IOS下不能播放。后來我把頁面結構改成只放一個Audio,然后把所有的音頻地址放進數組,循環播放。就OK了...后來我查了些資料,分析了原因可能如下(以后有時間等我做更多測試):

var audio1 = document.getElementById('audio1');

var audio2 = document.getElementById('audio2');

audio1.play();

// at a later time

audio2.play();

// there will be a few-seconds delay as iOS is instantiating a new audio object.

// at an even later time

audio1.play(); // there will also be a few-seconds delay, as the audio object

// for audio1 in iOS was destroyed when we played audio2.

在切換音頻對象時的 HTML5 音頻延時,調用play()在默認情況下會失敗,如果在將要加載但尚未載入其元數據的音頻流上嘗試設置currentTime,則會拋出一個致命錯誤。音頻文件不能緩存在 iOS 上的移動版 manifest 中。只有在對某個離線應用程序使用清單 (manifest) 時,這才適用。如果一個音頻文件包含在此清單中,iOS 將會忽略它,并且不會緩存此文件。每當此 Web 應用程序需要訪問此音頻文件時,都需要從該網絡訪問此文件。

用 JavaScript 以編程方式進行相關設置時,移動版 Safari 并不會尊重此音量和playbackRate屬性。更改屬性也不會實際調整這些值。音量總是在用戶控制下,并且playbackRate在移動版 Safari 中仍然不受支持。音量總是保持設置為 1,playbackRate則會設置為希望設置的新值,但是音頻流回放的實際速度不會發生改變。這會為onratechange事件帶來某些復雜性,我們將在不受支持的事件部分對此進行討論。

在 iOS 5 之前,循環屬性是不受支持的。為了解決缺乏支持的問題,可以向onended事件添加了一個事件偵聽程序,并在該函數中調用play()。

4音頻文件暫停和播放操作間隔時間問題;


谷歌模擬器截圖


問題圖樣

上面三個問題解決了,測試基本沒有問題。但是打開谷歌的模擬器看到了一個報錯,“The play() request was interrupted by a call to pause()”,雖然不影響程序功能,但是身為處女座的我,這個紅色的一欄我不能忍,于是我找到如下方法解決:

var isPlaying = myaudio.currentTime > 0 && !myaudio.paused && !myaudio.ended && myaudio.readyState > 2;

if (!isPlaying) {

setTimeout(function () {

myaudio.play().catch(function (e) {

console.log("", e.message);

console.log("", e.description);

});

}, 150);

} else {

alert("網絡緩慢,正在加載音頻...");

}

先判斷音頻加載狀態等,然后用setTimeout延時處理播放,把拋出的異常接收~然后整個測試就幾乎完美~

問題三還有種更優雅的解決辦法,那就是用Audio sprite,它的原理類似于CSS sprite,就是把所有音頻放入一個音頻文件里,根據不同的判斷,播放不同的片段~~ 這個是國外的DEMO。有興趣的同學可以嘗試下~

未完待續,今天暫時就這樣吧~ ?下班了~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容