? ? ? 在iOS的Safari瀏覽器上播放緩存的音頻供離線使用一直是一個挑戰,已經被證明是[不可能完成的任務](http://happyworm.com/blog/2012/05/29/playing-web-audio-offline-on-mobile-safari-mission-impossible/)?。但隨著[網絡音頻](https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html)API的發展(僅支持WebKit內核),現在終于實現了-不過還需要經過一些步驟。
? ? ??壞消息是我們還無法使用[應用緩存](http://html5doctor.com/go-offline-with-application-cache/)緩存MP3文件,然后簡單地使用XmlHttpRequest進行加載。iOS6上的Safari瀏覽器可以緩存MP3,但是會拒絕播放它。
? ? ??**但是這不代表著無藥可救**
? ? ??**使用Base64編碼**
? ? ??因為網絡音頻API為開發者提供了[AudioBuffer](https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode),你現在可以馬上使用它來轉換數據格式,并且把它們直接采用網絡音頻API來進行播放。例如,如果你把一個MP3文件編碼成Base64,你可以把它解碼為[ArrayBuffer](https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer),變成原始的音頻數據。
? ? ??**編碼音頻文件**
? ? ??你可以很容易地使用[OpenSSL](http://www.openssl.org/)將MP3文件轉換為Base64字符串。MacOS X系統已經預裝了OpenSSL,所以只需打開終端程序,然后鍵入以下命令:
~~~
openssl base64 -in [infile] -out [outfile]
~~~
? ? ??請確保把[infile]更換為你MP3的路徑,而將[outfile]替換為你所選擇的編碼數據的目標路徑。
? ? ??這將把聲音文件輸出為Base64編碼的字符串。然后,你可以選擇使用任何形式的網絡存儲(例如[應用緩存](http://html5doctor.com/go-offline-with-application-cache/),[本地存儲](http://html5doctor.com/storing-data-the-simple-html5-way-and-a-few-tricks-you-might-not-have-known/),或者[webSQL](http://html5doctor.com/introducing-web-sql-databases/))來緩存字符串。
? ? ??**Base64到ArrayBuffer**
? ? ??為了把Base64字符串解碼為ArrayBuffer,你需要使用一個自定義的方法。丹尼爾·格雷羅的[base64-binary.js](https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js)是一個好的腳本,可以準確的實現這個目的。它把Base64字符串轉換成一個[Uint8Array](https://developer.mozilla.org/en/JavaScript_typed_arrays/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);
~~~
? ? ??**演示和源代碼**
? ? ??此處是[在線演示](http://alxgbsn.co.uk/offlinewebaudio/)和[源代碼](https://github.com/alexgibson/offlinewebaudio)。
? ? ??**瀏覽器支持**
? ? ??目前此演示支持Safari 6,Chrome桌面版和iOS6 Safari瀏覽器。該技術未來可以工作在任何支持網絡音頻API的瀏覽器上,所以我希望Chrome移動瀏覽器能盡快的添加支持。
? ? ??W3C目前正在完善網絡音頻API[標準](http://www.w3.org/2011/audio/wiki/W3C_Audio_Publications_and_Milestones)。
??????? 譯自:[http://html5doctor.com/taking-web-audio-offline-in-ios-6-safari/](http://html5doctor.com/taking-web-audio-offline-in-ios-6-safari/)
??????? 轉載請注明出處:蔣宇捷的博客-http://blog.csdn.net/hfahe
- 前言
- AutoPager的簡單實現
- 利用CSS3特性巧妙實現漂亮的DIV箭頭
- IE9在Win7下任務欄新特性簡介
- 瀏覽器九宮格的簡單實現
- Raphael js庫簡介
- 使用CSS3構建Ajax加載動畫
- 用CSS3創建動畫價格表
- 用CSS3實現瀏覽器的縮放功能
- 用純CSS3實現QQ LOGO
- 用CSS3創建旋轉載入器
- 使用Javascript開發移動應用程序
- 用HTML5創建超酷圖像灰度漸變效果
- 使用CSS3創建文字顏色漸變(CSS3 Text Gradient)
- 僅用CSS創建立體旋轉幻燈片
- 如何創建跨瀏覽器的HTML5表單
- 用CSS3實現動畫進度條
- HTML5 Guitar Tab Player
- 奇妙的HTML5 Canvas動畫實例
- 談HTML5和CSS3的國際化支持
- 實現跨瀏覽器的HTML5占位符
- 前端開發必備工具:WhatFont Bookmarklet-方便的查詢網頁上的字體
- 使用HTML5和CSS3來創建幻燈片
- HTML5之美
- 如何使用HTML5創建在線精美簡歷
- 以小見大、由淺入深-談如何面試Javascript工程師
- 快速入門:HTML5強大的Details元素
- 用CSS3實現圖像風格
- HTML5視頻字幕與WebVTT
- 用純CSS3實現Path華麗動畫
- 用3個步驟實現響應式網頁設計
- 遇見CSS3濾鏡
- 關于CSS3濾鏡的碎念
- 用純CSS3繪制萌系漫畫人物動態頭像
- CSS3新的鼠標樣式介紹
- 用HTML5獻上愛的3D玫瑰
- 對HTML5 Device API相關規范的解惑
- 如何使用HTML5實現拍照上傳應用
- 2012第一季度國外HTML5移動開發趨勢
- HTML5新特性:范圍樣式
- 百度開發者大會-《用HTML5新特性開發移動App》PPT分享
- Chrome 19對于HTML5最新支持的動態:電池狀態API,全屏API,震動API,語音API
- 遇見Javascript類型數組(Typed Array)
- 用HTML5 Audio API開發游戲音樂
- 用HTML5實現人臉識別
- 用Javascript實現人臉美容
- Chrome 20對于HTML5最新支持的動態:顏色輸入,網絡信息API,CSS著色器
- 用HTML5實現手機搖一搖的功能
- 用HTML5實現iPad應用無限平滑滾動
- 用非響應式設計構建跨端Web App
- 了解SVG
- HTML5圖像適配介紹
- HTML5安全:內容安全策略(CSP)簡介
- HTML5安全:CORS(跨域資源共享)簡介
- 用CSS3 Region和3D變換實現書籍翻頁效果
- 談談移動App的思維誤區
- Chrome新特性:文件夾拖拽支持
- 《關注HTML5安全》
- HTML5安全風險詳析之一:CORS攻擊
- HTML5安全風險詳析之二:Web Storage攻擊
- HTML5圖像適配最新進展:響應式圖片規范草案
- HTML5移動Web App相關標準狀態及路線圖
- HTML5安全風險詳析之三:WebSQL攻擊
- Chrome引入WebRTC支持視頻聊天App
- HTML5安全風險詳析之四:Web Worker攻擊
- HTML5安全風險詳析之五:劫持攻擊
- HTML5安全風險詳析之六:API攻擊
- HTML5安全攻防詳析之七:新標簽攻擊
- 在iOS Safari中播放離線音頻
- 使用WebRTC實現遠程屏幕共享
- Firefox、Android、iOS遇見WebRTC
- HTML5光線傳感器簡介
- HTML5安全攻防詳析之八:Web Socket攻擊
- HTML5安全攻防詳析之完結篇:HTML5對安全的改進
- 激動人心!在網頁上通過語音輸入文字 - HTML5 Web Speech API介紹
- Web滾動性能優化實戰
- 用CSS3設計響應式導航菜單
- 用HTML5構建高性能視差網站
- 漫談@supports與CSS3條件規則
- HTML5下載屬性簡介
- 如何開發優秀的HTML5游戲?-迪斯尼《尋找奧茲之路》游戲技術詳解(一)
- 如何開發優秀的HTML5游戲?-迪斯尼《尋找奧茲之路》游戲技術詳解(二)
- 趨勢:Chrome為打包應用提供強大新特性
- 從HTML5移動應用現狀談發展趨勢
- 基于HTML5的Web跨設備超聲波通信方案