2014-10-16 57 views
2

我希望在Web Audio API中實現需要連續訪問兩個或更多音頻流的音頻效果。ScriptProcessorNode的獨特立體聲輸入

我可以定義與2個輸入通道和2個輸出信道的腳本處理器:

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

我可以然後幾個正弦波連接到該處理器:

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

有一種方法來將它們連接到音頻處理器的特定輸入通道?最後,當我編寫onaudioprocess函數並單獨偵聽每個輸入通道時,每個輸入通道都包含連接到處理器的聲音,所有都是。我無法在onaudioprocess函數內單獨訪問每個正弦波。它是否正確?或者有沒有辦法將聲音連接到腳本處理器的單個輸入通道?

回答

3

您既可以創建兩個相同的單聲道ScriptProcessors或可能使用的信道合併到兩個正弦波分配給這樣的腳本處理器的每個通道:

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();

+3

使用ChannelMerger 。這就是它的目的。 – cwilso 2014-10-17 14:59:46