在iOS的Safari瀏覽器上播放緩衝的音頻供離線使用一直是一個挑戰,已經被證明是不可能完成的任務 。但隨著網路音頻API的發展(僅支援WebKit核心),現在終於實現了-不過還需要經過一些步驟。
壞訊息是我們還無法使用應用緩衝緩衝MP3檔案,然後簡單地使用XmlHttpRequest進行載入。iOS6上的Safari瀏覽器可以緩衝MP3,但是會拒絕播放它。
但是這不代表著無藥可救...
使用Base64編碼
因為網路音頻API為開發人員提供了AudioBuffer,你現在可以馬上使用它來轉換資料格式,並且把它們直接採用網路音頻API來進行播放。例如,如果你把一個MP3檔案編碼成Base64,你可以把它解碼為ArrayBuffer,變成原始的音頻資料。
編碼音頻檔案
你可以很容易地使用OpenSSL將MP3檔案轉換為Base64字串。MacOS X系統已經預裝了OpenSSL,所以只需開啟終端程式,然後鍵入以下命令:
openssl base64 -in [infile] -out [outfile]
請確保把[infile]更換為你MP3的路徑,而將[outfile]替換為你所選擇的編碼資料的目標路徑。
這將把音效檔輸出為Base64編碼的字串。然後,你可以選擇使用任何形式的網路儲存(例如應用緩衝,本機存放區,或者webSQL)來緩衝字串。
Base64到ArrayBuffer
為了把Base64字串解碼為ArrayBuffer,你需要使用一個自訂的方法。丹尼爾·格雷羅的base64-binary.js是一個好的指令碼,可以準確的實現這個目的。它把Base64字串轉換成一個Uint8Array類型的數組,並將其儲存在一個ArrayBuffer中。
一旦做到這一點,你可以簡單地採用網路音頻API的decodeAudioData()方法來解碼音頻資料:
var buff = Base64Binary.decodeArrayBuffer(sound);myAudioContext.decodeAudioData(buff, function(audioData) { myBuffer = audioData; });
一旦你的音頻資料解碼完成,將它傳遞給音頻緩衝源並播放聲音:
mySource = myAudioContext.createBufferSource();mySource.buffer = myBuffer;mySource.connect(myAudioContext.destination);mySource.noteOn(0);
示範和原始碼
此處是線上示範和原始碼。
瀏覽器支援
目前此示範支援Safari 6,Chrome案頭版和iOS6 Safari瀏覽器。該技術未來可以工作在任何支援網路音頻API的瀏覽器上,所以我希望Chrome行動瀏覽器能儘快的添加支援。
W3C目前正在完善網路音頻API標準。
譯自:http://html5doctor.com/taking-web-audio-offline-in-ios-6-safari/
轉載請註明出處:蔣宇捷的部落格-http://blog.csdn.net/hfahe