创建一个具有4个通道的audioWorkletNode?

时间:2018-09-12 08:12:12

标签: web-audio channels mixing

我正在使用Webaudio / audioWorkletNode开发一个mod播放器,它是一个具有4个不同音轨(通道)的音频文件。

我使用2声道(立体声)音频节点使它正常工作:

  • 0和3通道(音轨)混入左通道
  • 通道(音轨)1和2混入正确的通道

问题是我想分析并显示每个轨道的波形显示(因此应该有4个不同的分析器)。

我的想法是创建一个outputChannelCount设置为[4]的audioWorkletNode,将分析器连接到该节点的四个通道中的每个通道,然后使用channelMerger将其混合为2个立体声通道。

因此,我使用了以下代码,希望它创建一个具有4个通道的节点:

  

let node = new AudioWorkletNode(context,'processor',{outputChannelCount:[4]});

但是outputChannelCount参数似乎被忽略了。不管我指定什么,最后都设置为2个通道。

是否可以使用另一种方法进行分析?还是我必须使用自己的分析仪自己进行分析?

1 个答案:

答案 0 :(得分:0)

我终于找到了一种混合所有四个通道并将每个通道传递到其自己的分析仪的方法:

this.context.audioWorklet.addModule(`js/${soundProcessor}`).then(() => 
{
    this.splitter = this.context.createChannelSplitter(4);
    // Use 4 inputs that will be used to send each track's data to a separate analyser
    // NOTE: what should we do if we support more channels (and different mod formats)?
    this.workletNode = new AudioWorkletNode(this.context, 'mod-processor', {
            outputChannelCount: [1, 1, 1, 1],
            numberOfInputs: 0,
            numberOfOutputs: 4
    });

    this.workletNode.port.onmessage = this.handleMessage.bind(this);
    this.postMessage({
        message: 'init',
        mixingRate: this.mixingRate
    });
    this.workletNode.port.start();

    // create four analysers and connect each worklet's input to one
    this.analysers = new Array();

    for (let i = 0; i < 4; ++i) {
        const analyser = this.context.createAnalyser();
        analyser.fftSize = 256;// Math.pow(2, 11);
        analyser.minDecibels = -90;
        analyser.maxDecibels = -10;
        analyser.smoothingTimeConstant = 0.65;
        this.workletNode.connect(analyser, i, 0);
        this.analysers.push(analyser);
    }

    this.merger = this.context.createChannelMerger(4);

    // merge the channel 0+3 in left channel, 1+2 in right channel
    this.workletNode.connect(this.merger, 0, 0);
    this.workletNode.connect(this.merger, 1, 1);
    this.workletNode.connect(this.merger, 2, 1);
    this.workletNode.connect(this.merger, 3, 0);
     this.merger.connect(this.context.destination);
});

我基本上创建了一个具有4个输出的新节点,并将这些输出用作通道。为了产生立体声输出,我可以使用通道合并。瞧!

该应用程序的完整源代码可以在这里找到:https://warpdesign.github.io/modplayer-js/