如何从 AudioContext 获取缓冲区/原始数据?

Ada*_*m D 6 javascript html5-audio web audiocontext

GetUserMedia()我正在尝试使用和API记录并保存来自用户麦克风的声音剪辑AudioContext

我已经能够使用MediaRecorderAPI 执行此操作,但不幸的是,Safari/iOS 不支持这一点,因此我想仅使用 APIAudioContext和来自该 API 的缓冲区来执行此操作。

我从 Google Web 基础知识中获得了本教程的部分功能,但我不知道如何执行他们建议的以下步骤。

var handleSuccess = function(stream) {
    var context = new AudioContext();
    var source = context.createMediaStreamSource(stream);
    var processor = context.createScriptProcessor(1024, 1, 1);

    source.connect(processor);
    processor.connect(context.destination);

    processor.onaudioprocess = function(e) {
        // ******
        // TUTORIAL SUGGESTS: Do something with the data, i.e Convert this to WAV 
        // ******
        // I ASK: How can I get this data in a buffer and then convert it to WAV etc.??
        // *****
        console.log(e.inputBuffer);
    };
};

navigator.mediaDevices.getUserMedia({ audio: true, video: false })
    .then(handleSuccess);
Run Code Online (Sandbox Code Playgroud)

正如教程所说:

缓冲区中保存的数据是来自麦克风的原始数据,您可以通过多种选项来处理这些数据:

  • 直接上传到服务器
  • 存储在本地
  • 转换为专用文件格式,例如 WAV,然后将其保存到您的服务器或本地

我可以做到这一切,但一旦停止 context ,我就无法弄清楚如何获取音频缓冲区

MediaRecorder可以做这样的事情:

mediaRecorder.ondataavailable = function(e) {
    chunks.push(e.data);
}
Run Code Online (Sandbox Code Playgroud)

然后当你完成录制时,你就会在chunks. 正如教程所建议的,必须有一种方法,但我在第一个代码示例中找不到data推入缓冲区的方法。

一旦我获得了音频缓冲区,我就可以将其转换为 WAV并将其转换为 blob 等。

谁能帮我这个?(我不想使用MediaRecorderAPI​​)

小智 0

e.inputBuffer.getChannelData(0)
Run Code Online (Sandbox Code Playgroud)

其中 0 是第一个通道。这应该返回一个带有原始 PCM 数据的 Float32Array,然后您可以将其转换为 ArrayBuffere.inputBuffer.getChannelData(0).buffer并发送给工作人员,工作人员会将其转换为所需的格式。

.getChannelData() 文档:https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer/getChannelData

关于类型化数组:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays,https : //javascript.info/arraybuffer-binary-arrays

  • 虽然此链接可以回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会变得无效。 (3认同)