在iOS Safari中播放離線音頻

        在iOSSafari瀏覽器上播放緩存的音頻供離線使用一直是一個挑戰,已經被證明是不可能完成的任務 。但隨着網絡音頻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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章