gpt4 book ai didi

web-audio-api - 创建一个带有 4 个 channel 的 audioWorkletNode?

转载 作者:行者123 更新时间:2023-12-02 00:58:36 26 4
gpt4 key购买 nike

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

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

  • 声道(轨道)0 和 3 混合到左声道
  • channel (轨道)1 和 2 混合到右 channel

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

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

    所以我使用了以下代码,期望它创建一个具有 4 个 channel 的节点:

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



    但是 outputChannelCount 参数似乎被忽略了。无论我指定什么,它最终都设置为 2 个 channel 。

    有没有办法做到这一点,或者我必须自己处理分析,使用我自己的分析仪?

    最佳答案

    我终于找到了一种混合所有四个 channel 并将每个 channel 传递给它自己的分析器的方法:

    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 个输出的新节点,并将输出用作 channel 。为了产生立体声输出,我可以使用 channel 合并。瞧!

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

    关于web-audio-api - 创建一个带有 4 个 channel 的 audioWorkletNode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52290471/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com