2014-12-02 1 views
1
var context = new webkitAudioContext(); 
var url = [ "/foo.mp3"]; 
function init(callback) { 
    var req = new XMLHttpRequest(); 
    var audioBuffers = []; 
    for(var i = 0; i < url.length; i++) { 
    req.open("GET", url[i], true); 
    req.responseType = "arraybuffer"; 

    req.onload = function() { 
     context.decodeAudioData(req.response, function(buffer) { 
     //blah blah push buffer into an array 
     }); 
    req.send(); 
    } 

    if(callback) callback(audioBuffers); 

} 

Это прекрасно работает, не поймите меня неправильно. Дело в том, что я хочу, чтобы он загружался синхронно, а не асинхронно.Как преобразовать аудио в arrayBuffer, используя синхронный запрос ajax?

req.open("GET", url[i], true) 

Последний аргумент - это то, где вы объявляете его синхронным или нет. По какой-то причине, когда я делаю это ложным, вы не можете изменить свой responseType на arraybuffer.

Это затем разрывает метод, поскольку он не является массивным буфером и не может прочитать ответ. И удивительно естественное поведение.

context.decodeAudioData(req.response, function(buffer){}); 

Я сделал некоторые Reasearch на это, но я нашел только методы только для преобразования строк в массив Buffer. Для этого случая я конвертирую аудио, как формат mp3, в массив буферов, сохраняя запрос синхронным. Есть ли обходные пути для этого?

+0

Возможно, это невозможно. Это может быть даже преднамеренно - синхронно выполнять ajax настоятельно не рекомендуется. – soktinpk

+0

Но я действительно не вижу в этом вреда? Простое XMLHttpRequests и преобразование в аудиобуфер. – user43353

+0

вред, выполняющий операцию синхронизации, повесит ваш браузер на длительность его периода ожидания - в том числе шунтирование в любой момент воспроизведения звука. –

ответ

0

Со стандартной стороны. Есть слухи (возможно, правда, правда), что синхронный запрос будет оставлен в будущей спецификации. Новые функции не накладываются на поддержку. Проверьте this message.

Спецификация XMLHttpRequest2 была недавно изменена, чтобы запретить отправку синхронного запроса при установке xhr.responseType.

Вот the spec:

Если асинхронной ложно, есть связанные XMLHttpRequest документ и либо значение атрибута ожидания не равен нулю, то withCredentials значение атрибута истинно, или атрибут responseType значение не является пустой строкой, выведите исключение «InvalidAccessError» и завершите эти шаги.

Со стороны приложения. Использование ArrayBuffer обычно означает, что запрашиваемый ресурс - это как-то большой двоичный файл. Хотя синхронный запрос блокирует пользовательский интерфейс, это очень плохой пользовательский интерфейс. Поэтому, даже если вы можете это сделать, это тоже не очень хорошая идея.

+0

Хм. Я пытался загрузить все файлы прежде, чем мой код будет выполнен, так как есть код, который зависит от файлов. Если он выполняется, прежде чем загрузка не будет завершена, файлы выйдут как неопределенные. – user43353

+0

@ user43353 Вам может понадобиться инструмент управления ресурсами, как это делают большинство игр для HTML. – Leo

Смежные вопросы