【问题标题】:Concatenating audio blobs连接音频 blob
【发布时间】:2016-12-12 15:31:39
【问题描述】:

我尝试使用 Web RTC experiment by Muaz Khan 连接音频 blob,但是当我播放连接的音频时,HTML 音频元素不会显示音频文件的完整长度,而且如果您下载并播放,问题仍然存在。我使用 ffmpeg 连接这些 blob,但有一种方法可以使用 Web RTC js experiment by Muaz Khan 连接音频 blob。类似的尝试也没有成功:Combine two audio blob recordings

【问题讨论】:

标签: javascript node.js audio ffmpeg recorder.js


【解决方案1】:

最好的方法是将 blob 转换为 AudioBuffers(使用 FileReader 将 blob 转换为 ArrayBuffer,然后将这些 arrayBuffers 解码为 AudioBuffers)。然后,您可以合并/组合多个 AudioBuffers 并获得结果。 以下代码适用于这种情况:

var blob="YOUR AUDIO BLOB";
var f = new FileReader();
    f.onload = function (e) {

    audioContext.decodeAudioData(e.target.result, function (buffer) {


            arrayBuffer.push(buffer);



        if (arrayBuffer.length > 1) {
            resultantbuffer = appendBuffer(arrayBuffer[0], arrayBuffer[1]);
            arrayBuffer = [];
            arrayBuffer.push(resultantbuffer);
        }
        else {
            resultantbuffer = buffer;
        }


    }, function (e) {
        console.warn(e);
    });
};
f.readAsArrayBuffer(blob);

此代码读取 blob 并转换为 arrayBuffer (e.target.result) 并将这些缓冲区解码为 AudioBuffers (缓冲区)。我使用 appendBuffer 方法来附加多个 audioBuffers。方法如下:

function appendBuffer(buffer1, buffer2) {

    ///Using AudioBuffer
    var numberOfChannels = Math.min(buffer1.numberOfChannels, buffer2.numberOfChannels);
    var tmp = recordingAudioContext.createBuffer(numberOfChannels, (buffer1.length + buffer2.length), buffer1.sampleRate);
    for (var i = 0; i < numberOfChannels; i++) {
        var channel = tmp.getChannelData(i);
        channel.set(buffer1.getChannelData(i), 0);
        channel.set(buffer2.getChannelData(i), buffer1.length);
    }
    return tmp;

}

如果您遇到任何问题,请告诉我。

【讨论】:

  • 是的。我尝试了类似的方法,但生成的音频文件不正确。我的意思是媒体播放器上显示的音频文件的长度只是第一个 blob 的长度。我没有尝试过您在回答中提到的内容,但是如果您可以在 git 上提出一个可行的解决方案,那将非常有帮助。
  • 如果你的音频块很好,那么这个解决方案就可以了。您只需要解码 AudioBuffer 中的 auido blob(即可附加),上面是附加 AudioBuffers 的代码。是的,当您收到或获得生成的 AudioBuffer 时,您必须使它们可播放。您可以将该缓冲区编码为 wav 格式。以下是您可以关注的相关链接:danieldemmel.me/JSSoundRecorder
  • 谢谢,我会试试这个:)
  • 我已经附加了我拥有的所有音频缓冲区并获得了正确的缓冲区。然后,我将音频缓冲区编码为音频/wav 格式并创建了 blob。但是,当我以音频/wav 播放时,没有声音并且我的 blob 是静音的。请帮忙。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2012-05-16
  • 2018-04-03
  • 1970-01-01
  • 2017-03-12
  • 2019-07-19
  • 2018-04-06
  • 2016-09-06
相关资源
最近更新 更多