3

例如,我想将 100MB 的 mp3 文件加载到 AudioContext 中,我可以使用 XMLHttpRequest 来做到这一点。

但是使用这个解决方案我需要加载所有文件,然后我才能播放它,因为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 中加载像流这样的音频文件?

4

2 回答 2

4

您需要以流的方式处理 ajax 响应。在 fetch 和 ReadableStream 在所有浏览器中正确实施之前,没有标准的方法可以做到这一点

我将根据新标准向您展示最正确的方法,您应该如何处理流 ajax 响应

// 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/edge 有ms-stream你可以使用但它更复杂

于 2016-12-13T13:36:50.270 回答
0

我怎样才能发送value.bufferAudioContext

这只播放第一个块,它不能正常工作。

const context = new AudioContext()
const source = context.createBufferSource()
source.connect(context.destination)
        
const reader = response.body.getReader()
        
while (true) {
    await reader.read()
    const { done, value } = await reader.read()

    if (done) {
        break
    }

    const buffer = await context.decodeAudioData(value.buffer)
    source.buffer = buffer
    source.start(startTime)
}
于 2021-07-07T18:18:44.963 回答