MIX Wav 文件并使用 Web Audio 导出 API

MIX Wav file and export it with Web Audio API

我是一名来自日本的网络开发人员。
这是关于堆栈溢出的第一个问题。

我现在正在创建一个简单的音乐 Web 应用程序。
制作音乐系统程序完全是初学者,所以我在努力实现它。

经过各种调查,我注意到使用网络音频 API 是最佳选择, 所以,我决定使用它。

▼ 我想达到的目标

例如加载吉他、鼓、钢琴等多个wav文件,以及 在浏览器上编辑,最后输出为一个Wav文件。 然后我们就可以从浏览器下载那个编辑好的wav文件,我们就可以播放itunes了。

▼ 问题

我在 github 上检查了 Record.js,但是开发已经停止了大约 2 ~ 3 年并且有很多问题,我无法获得支持。所以我决定不使用它。 我也检查了类似的问题 Web audio API: scheduling sounds and exporting the mix

资料太旧了,不知道还能不能用 谢谢。

您好,欢迎来到 Stack Overflow!

是否可以仅使用网络音频实现此目的api?

就 merging/mixing 文件而言,这是完全可以实现的! This article 执行您建议的任务所需的许多(如果不是全部)步骤。

您要上传的每个文件都可以加载到 AudioBufferSource (examples explained in that article linked before) 音频数据加载后设置缓冲区源的示例:

play: function (data, callback) {
    // create audio node and play buffer
    var me = this,
        source = this.context.createBufferSource(),
        gainNode = this.context.createGain();
    if (!source.start) { source.start = source.noteOn; }
    if (!source.stop) { source.stop = source.noteOff; }
    source.connect(gainNode);
    gainNode.connect(this.context.destination);
    source.buffer = data;
    source.loop = true;
    source.startTime = this.context.currentTime; // important for later!
    source.start(0);
    return source;
}

然后还有一些特定的节点已经为您的混音目的而设计,例如 ChannelMergerNode(将多个单声道组合到一个新的通道缓冲区中)。如果您不想在 javascript 中自己处理信号,但使用 Web Audio 对象会更快,因为它们是浏览器中已有的本机编译代码。

complete guide sent before 之后,还有使用以下代码导出文件的选项(在演示案例中为 .wav):

var rate = 22050;

function exportWAV(type, before, after){
    if (!before) { before = 0; }
    if (!after) { after = 0; }

    var channel = 0,
        buffers = [];
    for (channel = 0; channel < numChannels; channel++){
        buffers.push(mergeBuffers(recBuffers[channel], recLength));
    }

    var i = 0,
        offset = 0,
        newbuffers = [];

    for (channel = 0; channel < numChannels; channel += 1) {
        offset = 0;
        newbuffers[channel] = new Float32Array(before + recLength + after);
        if (before > 0) {
            for (i = 0; i < before; i += 1) {
                newbuffers[channel].set([0], offset);
                offset += 1;
            }
        }
        newbuffers[channel].set(buffers[channel], offset);
        offset += buffers[channel].length;
        if (after > 0) {
            for (i = 0; i < after; i += 1) {
                newbuffers[channel].set([0], offset);
                offset += 1;
            }
        }
    }

    if (numChannels === 2){
        var interleaved = interleave(newbuffers[0], newbuffers[1]);
    } else {
        var interleaved = newbuffers[0];
    }

    var downsampledBuffer = downsampleBuffer(interleaved, rate);
    var dataview = encodeWAV(downsampledBuffer, rate);
    var audioBlob = new Blob([dataview], { type: type });

    this.postMessage(audioBlob);
}

所以我认为 Web-Audio 拥有您为此目的所需的一切!然而,根据您的 Web 开发经验,这可能具有挑战性,但这绝对是一项值得学习的技能!

我们需要使用其他库吗?

如果可以的话,我认为 Web-Audio, as you'll almost definately get the best speeds for processing, but there are other libraries such as Pizzicato.js 绝对值得一试。我相信您会找到很多其他的。