【问题标题】:How to visualize recorded audio from Blob with AudioContext?如何使用 AudioContext 可视化来自 Blob 的录制音频?
【发布时间】:2021-07-03 10:37:04
【问题描述】:

我已经成功创建了一个基于mdn example here 的音频波形可视化器。我现在也想为录制的音频添加可视化。我使用 MediaRecorder 录制音频并将结果保存为 Blob。但是我找不到将我的 AudioContext 连接到 Blob 的方法。

这是到目前为止的相关代码部分:

var audioContext = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioContext.createAnalyser();
var dataArray = new Uint8Array(analyser.frequencyBinCount);
        
if (mediaStream instanceof Blob)
    // Recorded audio - does not work
    var stream = URL.createObjectURL(mediaStream);
else
    // Stream from the microphone - works
    stream = mediaStream;

var source = audioContext.createMediaStreamSource(stream);
source.connect(analyser);

mediaStream 来自:

navigator.mediaDevices.getUserMedia ({
    audio: this.audioConstraints,
    video: this.videoConstraints,
})
.then( stream => {
      mediaStream = stream;
}

或作为记录数据的结果:

mediaRecorder.addEventListener('dataavailable', event => {
    mediaChunks.push(event.data);
});
...
mediaStream = new Blob(mediaChunks, { 'type' : 'video/webm' });

如何将 AudioContext 连接到录制的音频? Blob可以吗?我需要别的东西吗?我错过了什么?

我创建了一个fiddle。相关部分从第 118 行开始。

感谢您的帮助和建议。

编辑: 感谢 Johannes Klauß,我找到了解决方案。 请参阅updated fiddle

【问题讨论】:

    标签: javascript web-audio-api


    【解决方案1】:

    您可以使用 Response API 创建一个 ArrayBuffer 并使用音频上下文对其进行解码以创建一个可以连接到分析器的 AudioBuffer:

    mediaRecorder.addEventListener('dataavailable', event => {
        mediaChunks.push(event.data);
    });
    ...
    const arrayBuffer = await new Response(new Blob(mediaChunks, { 'type' : 'video/webm' })).arrayBuffer();
    const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
    
    const source = audioContext.createBufferSource();
    source.buffer = audioBuffer;
    source.connect(analyser);
    

    【讨论】:

    • 感谢您朝着正确的方向前进。我已经尝试过了,但 audioBuffer 没有连接方法。我现在尝试了 const arrayBuffer = await new Response(this.stream).arrayBuffer(); const audioBuffer = 等待 audioContext.decodeAudioData(arrayBuffer);源 = audioContext.createBufferSource(); source.buffer = 音频缓冲区; source.connect(分析器);但我没有得到任何可视化。
    • 这是正确的方法(抱歉,我错过了 AudioBufferSourceNode)。您是否检查了音频缓冲区是否有任何内容?或者您是否将 BufferSourceNode 连接到音频上下文目标以检查它是否播放?
    • 感谢 Johannes 回来。不知道我错过了什么。我在这里创建了一个测试用例:jsfiddle.net/kirschkern/atwu1zhj/5 相关部分从第 118 行开始。
    • 第 44 行是您唯一一次致电 visualize。您再也不会调用它,因此 audioBufferSource 将永远不会连接到分析器节点。
    • 这是有道理的。并开始播放音频:-) 现在它可以工作了。在jsfiddle.net/kirschkern/xm9b5g4L/1 上查看更新的小提琴非常感谢您的大力支持!
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多