2016-12-13 8 views
0

Например, я хочу загрузить mp3-файл 100 МБ в AudioContext, и я могу сделать это с помощью XMLHttpRequest.Как загрузить аудиофайл в AudioContext как поток?

Но с этим решением мне нужно загрузить весь файл, и только тогда я смогу его воспроизвести, потому что метод onprogress не возвращает данные.

xhr.onprogress = function(e) { 
    console.log(this.response); //return null 
}; 

Также я пытался сделать это с fetch методом, но этот способ имеет такую ​​же проблему.

fetch(url).then((data) => { 
    console.log(data); //return some ReadableStream in body, 
         //but i can't find way to use that 
}); 

Есть ли способ загрузить аудиофайлы, такие как поток в клиентском JavaScript?

ответ

0

Вам необходимо обработать ответ ajax потоковым способом. нет стандартного способа сделать это до тех пор, пока выборки & ReadableStream были должным образом реализованы во всех браузерах

Я покажу вам самый правильный путь в соответствии с новым стандартом, как вы должны иметь дело с потоковой АЯКС ответ

// only works in Blink right now 
fetch(url).then(res => { 
    let reader = res.body.getReader() 
    let pump =() => { 
     reader.read().then(({value, done}) => { 
      value // chunk of data (push chunk to audio context) 
      if(!done) pump() 
     }) 
    } 
    pump() 
}) 

Firefox работает над реализацией потоков, но до тех пор вы должны использовать XHR и moz-chunked-arraybuffer IE/край имеет ms-stream, что вы можете использовать, но это более сложный

+0

Спасибо, это выглядит нормально. Но последняя проблема - это значение, это не ArrayBuffer, и я не могу выразить это в аудиоконференции. –

+0

'value.buffer' - это ArrayBuffer (как с любым другим типизированным массивом' new Uint32Array(). Buffer') – Endless

+0

Действительно, спасибо :) –