【问题标题】:Unique stereo input to ScriptProcessorNodeScriptProcessorNode 的独特立体声输入
【发布时间】:2014-12-12 09:30:24
【问题描述】:

我希望在需要连续访问两个或多个音频流的 Web Audio API 中实现音频效果。

我可以定义一个带有 2 个输入通道和 2 个输出通道的脚本处理器:

var mod = context.createScriptProcessor(4096,2,2);

然后我可以将几个正弦波连接到这个处理器:

mySine.connect(mod);
mySine2.connect(mod);

有没有办法将它们连接到音频处理器的特定输入通道?

最终,当我编写一个 onaudioprocess 函数并单独收听每个输入通道时,每个输入通道都包含连接到处理器的所有声音。我无法在 onaudioprocess 函数中单独访问每个正弦波。它是否正确?或者有没有办法将声音连接到脚本处理器的单个输入通道?

【问题讨论】:

    标签: web-audio-api modulation scriptprocessor


    【解决方案1】:

    您可以创建两个相同的单通道 ScriptProcessor,也可以使用通道合并将两个正弦波分配给脚本处理器的每个通道,如下所示:

    var context = new AudioContext();   
    
    var sineA = context.createOscillator();
    sineA.type = 'sine';
    sineA.frequency.value = 300;
    
    var sineB = context.createOscillator();
    sineB.type = 'sine';
    sineB.frequency.value = 100;
    
    var script = context.createScriptProcessor(4096, 2, 2);
    
    // create 2 channel merger node
    var merger = context.createChannelMerger(2);
    
    // connect sineA to channel 0
    sineA.connect(merger, 0, 0);
    
    // connect sineA to channel 1
    sineB.connect(merger, 0, 1);
    
    // connect the script to the merger
    merger.connect(script);
    
    // process the audio data of each channel
    script.onaudioprocess = function(event) {
      var input = event.inputBuffer;
      var output = event.outputBuffer;
      var inputA = input.getChannelData(0);
      var inputB = input.getChannelData(1);
      var outputA = output.getChannelData(0);
      var outputB = output.getChannelData(1);
      
      for (var i = 0; i < input.length; i++) {
        outputA[i] = inputA[i];
        outputB[i] = inputB[i];
      }
    }
    
    script.connect(context.destination);
    
    sineA.start();
    sineB.start();

    【讨论】:

    • 使用 ChannelMerger。这就是它的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多