Моя цель: читать HTTP-аудиопоток HTTP из браузера и иметь доступ к необработанным аудиоданным.XMLHttpRequest и http streaming
HTML5 < аудио> позволяет мне легко играть поток, но, насколько я знаю, не предоставляет доступ к необработанным аудиоданных. Он просто играет.
JS XMLHTTPRequest может загружать файлы через HTTP и обрабатывать необработанные аудиоданные. Он кажется хорошим кандидатом, но он имеет ограничение: он не предоставляет доступ к двоичным данным до завершения загрузки (readystate = 4). В моем случае поток неограничен, поэтому readistate постоянно остается в 3, а XHR-ответ равен null (это поведение подробно описано в документации 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();
Кто-нибудь знает альтернативы или обходные пути для тех вариантов, так, что сырые бинарные пакеты могут быть считаны при загрузке потока?
Обратите внимание, что у меня нет контроля на сервере. Это поток icecast http. Кроме того, в браузере я бы хотел избежать использования Flash. Спасибо
Редактировать: для выяснения возможных вопросов, связанных с кросс-началом, JS запускается на странице, размещенной на сервере localhost.
Чтобы быть ясным, вы хотите, чтобы необработанные декодированные аудио данные PCM, а не битовый поток с сервера, да? Если это так, Web Audio API - это то, что вам нужно. – Brad
@Brad действительно я использую API веб-аудио (в качестве подсказки см., Например, метод decodeAudioData выше, в моем частичном коде). Мне просто не удалось получить буфер из потока и поместить его в API. Я думаю, что нашел решение, см. Мое решение ниже. – astooooooo