Моя цель — прочитать аудиопоток HTTP MP3 из браузера и получить доступ к необработанным аудиоданным.
HTML5 ‹ audio > позволяет легко воспроизводить поток, но, насколько мне известно, не предоставляет доступ к необработанным аудиоданным. Просто играет.
JS XMLHTTPRequest может загружать файлы через HTTP и обрабатывать необработанные аудиоданные. Кажется, это хороший кандидат, но у него есть ограничение: он не предоставляет доступ к двоичным данным, пока загрузка не будет завершена (readystate = 4). В моем случае поток неограничен, поэтому состояние готовности постоянно остается равным 3, а ответ XHR равен нулю (это поведение подробно описано в документации Mozilla). Обратите внимание, что политика перекрестного происхождения сервера, к которому я подключаюсь, — Access-Control-Allow-Origin: *
Пример кода, который работает для локальных обычных файлов, но не для потоков. Я получаю исключение нулевого указателя в request.response.length
request = new XMLHttpRequest();
//request.open('GET', 'test.mp3', true);
request.open('GET', 'http://domain.com/stream.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function() {
console.log("request onload");
var audioData = request.response;
audioCtx.decodeAudioData(audioData,
function(buffer) { myBuffer = buffer; source.buffer = myBuffer; },
function(e){"Error with decoding audio data" + e.err}
);
}
request.onreadystatechange = function() {
console.log("ready state = " + request.readyState);
console.log(request.response.length);
}
request.send();
Кто-нибудь знает альтернативы или обходные пути для этих вариантов, чтобы необработанные двоичные пакеты можно было читать во время загрузки потока?
Обратите внимание, что у меня нет контроля над сервером. Это ледяной http-поток. Кроме того, со стороны браузера я бы хотел избежать использования Flash. Спасибо
Изменить: чтобы прояснить возможные вопросы о перекрестном происхождении, JS запускается на странице, размещенной на локальном сервере.