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

时间:2018-06-28 07:21:23

标签: javascript audio web-audio web-audio-api

我是日本的Web开发人员。
这是关于堆栈溢出的第一个问题。

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

经过各种调查,我注意到使用Web Audio API是最佳选择, 因此,我决定使用它。

▼我要实现的目标

    Web音频API的
  • Multiple Wav files加载可以分为one Wav file并能够从浏览器下载。

例如,加载多个wav文件,例如吉他,鼓和钢琴,然后 在浏览器上对其进行编辑,最后将其输出为一个Wav文件。 然后,我们可以从浏览器下载经过编辑的wav文件,然后就可以播放iTunes。

▼问题

  • 是否仅通过使用Web音频api即可达到此要求?
  • 还是我们需要使用另一个库?

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

由于信息较旧,我不知道我是否仍然可以使用它 谢谢。

1 个答案:

答案 0 :(得分:0)

嗨,欢迎来到Stack Overflow!

是否可以仅使用网络音频API来实现?

就将文件合并/混合而言,这是完全可以实现的! This article经历了许多(如果不是全部)步骤,就可以执行建议的任务。

要上传的每个文件都可以加载到AudioBufferSource中(示例在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进行尝试,因为您几乎肯定会获得最佳的处理速度,但是还有其他库,例如Pizzicato.js仅举一例。我相信您还会找到很多其他人。