- PVSM.RU - https://www.pvsm.ru -
Воспроизведение кешированного аудио в оффлайн режиме в Safari под iOS долгое время было настоящим испытанием, которое было признано недостижимой целью [1]. Но с приходом веб аудио API [2] (только в движках WebKit), это наконец-то стало возможным, несмотря на то, что вам все-равно придется сделать несколько шагов.
Плохая новость в том, что вы все равно не сможете кешировать mp3 файлы, используя кеш приложения [3] и просто загружать их используя XmlHttpRequest
. Safari под iOS 6 будет кешировать mp3 файлы, но потом молча откажется воспроизводить их (очень полезно!)
Благодаря тому, что веб аудио API предоставляет разработчикам прямой доступ к аудио буферу [4], вы можете изменять формат данных на лету и передавать их напрямую веб аудио API для воспроизведения. Например, если вы закодируете mp3 файл в base64 строку, то потом сможете его раскодировать в ArrayBuffer [5] и конвертировать сырые аудио данные.
Вы можете легко конвертировать mp3 файл в base64 строку использую OpenSSL [6]. Если вы работаете под Mac OS X, где он предустановлен, просто откройте Terminal.app и введите следующую комманду:
openssl base64 -in [infile] -out [outfile]
Замените [infile] на путь к вашему mp3 файлу, а [outfile] на путь для сохранения закодированных данных.
Комманда сохранит, закодированное в base64 строке, представление аудио файла. Затем вы можете закешировать эту строку, используя любое веб хранилище на ваш выбор (например, кеш приложения [3], локальное хранилище [7] или webSQL [8])
Чтобы преобразовать base64 в ArrayBuffer, вам нужно использовать свое решение. Посмотрите решение base64-binary.js [9] Даниэля Гуерро(Daniele Guerrero). Это хороший скрипт, который создан специально для этой цели. Он преобразует base64 строку в Uint8Array [10] и сохраняет его в ArrayBuffer.
После этого вы можете просто декодировать аудио данные используя медо decodeAudioData()
из веб аудио API.
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);
Посмотрите онлайн демонстрацию [11] и исходный код [12] с дополнительными примерами использования техники из данной статьи.
Представленные демо работают под Safari 6, Chrome Desktop и Safari под iOS6. Техника, потенциально, может работать в любом браузере, который поддерживает веб аудио API, поэтому, надеемся, Chrome Mobile скоро добавить ее поддержку.
На данный момент, W3C продвигает веб аудио API как стандарт [13].
Автор: druf
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/html5/21227
Ссылки в тексте:
[1] недостижимой целью: http://happyworm.com/blog/2012/05/29/playing-web-audio-offline-on-mobile-safari-mission-impossible/
[2] веб аудио API: https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
[3] кеш приложения : http://html5doctor.com/go-offline-with-application-cache/
[4] аудио буферу: https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode
[5] ArrayBuffer: https://developer.mozilla.org/en/JavaScript_typed_arrays/ArrayBuffer
[6] OpenSSL: http://www.openssl.org/
[7] локальное хранилище: http://html5doctor.com/storing-data-the-simple-html5-way-and-a-few-tricks-you-might-not-have-known/
[8] webSQL: http://html5doctor.com/introducing-web-sql-databases/
[9] base64-binary.js: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
[10] Uint8Array: https://developer.mozilla.org/en/JavaScript_typed_arrays/Uint8Array
[11] онлайн демонстрацию: http://alxgbsn.co.uk/offlinewebaudio/
[12] исходный код: https://github.com/alexgibson/offlinewebaudio
[13] как стандарт: http://www.w3.org/2011/audio/wiki/W3C_Audio_Publications_and_Milestones
[14] Источник: http://habrahabr.ru/post/160465/
Нажмите здесь для печати.