16

我有一个使用MediaRecorderapi 创建的音频文件/blob:

let recorder = new MediaRecorder(this.stream)
let data = [];
recorder.ondataavailable = event => data.push(event.data);

然后在录制完成后:

let superBlob = new Blob(data, { type: "video/webm" });

如何使用此 blob 创建一个AudioBuffer?我需要:

  • Blob对象转换为ArrayBuffer我可以使用的AudioContext.decodeAudioData一个(返回一个AudioBuffer)或
  • Blob对象转换为Float32Array,我可以将其复制到AudioBufferwithAudioBuffer.copyToChannel()

任何有关如何实现这一目标的提示都值得赞赏。干杯!

4

4 回答 4

12

要将Blob对象转换为ArrayBuffer,请使用FileReader.readAsArrayBuffer

let fileReader = new FileReader();
let arrayBuffer;

fileReader.onloadend = () => {
    arrayBuffer = fileReader.result;
}

fileReader.readAsArrayBuffer(superBlob);
于 2016-11-01T16:36:28.623 回答
8

接受的答案很好,但只给出了一个不是音频缓冲区的数组缓冲区。您需要使用音频上下文将数组缓冲区转换为音频缓冲区。

const audioContext = AudioContext()
const fileReader = new FileReader()

// Set up file reader on loaded end event
fileReader.onloadend = () => {

    const arrayBuffer = fileReader.result as ArrayBuffer

    // Convert array buffer into audio buffer
    audioContext.decodeAudioData(arrayBuffer, (audioBuffer) => {

      // Do something with audioBuffer
      console.log(audioBuffer)

    })

}

//Load blob
fileReader.readAsArrayBuffer(blob)

我希望答案包括一个使用decodeAudioData. 我不得不在其他地方找到它,我想既然这是“Blob to Audio Buffer”的热门搜索,我会为下一个进入这个兔子洞的人添加一些有用的信息。

于 2020-02-02T10:33:31.900 回答
2

所有的答案都是真实的。但是,在 Chrome 76 和 Firefox 69 等现代网络浏览器中,有一种更简单的方法:使用Blob.arrayBuffer()

由于Blob.arrayBuffer()返回一个 Promise,您可以执行以下任一操作

superBlob.arrayBuffer().then(arrayBuffer => {
  // Do something with arrayBuffer
});

或者

async function doSomethingWithAudioBuffer(blob) {
  var arrayBuffer = await blob.arrayBuffer();
  // Do something with arrayBuffer;
}
于 2020-06-05T06:22:50.547 回答
1

两个答案都是正确的,有一些小的变化。这是我最终使用的功能:

function convertBlobToAudioBuffer(myBlob) {

  const audioContext = new AudioContext();
  const fileReader = new FileReader();

  fileReader.onloadend = () => {

    let myArrayBuffer = fileReader.result;

    audioContext.decodeAudioData(myArrayBuffer, (audioBuffer) => {

      // Do something with audioBuffer

    });
  };

  //Load blob
  fileReader.readAsArrayBuffer(myBlob);
}
于 2020-04-30T20:16:42.973 回答