2016-05-29 9 views
5

Ich versuche, einen ScriptProcessorNode mit zwei Eingangs- und einem Ausgangskanal zu implementieren.Wie kann ich zwei Eingabekanäle mit dem ScriptProcessorNode verbinden? (Web Audio API, JavaScript)

var source = new Array(2); 

source[0] = context.createBufferSource(); 
source[0].buffer = buffer[0]; 

source[1] = context.createBufferSource(); 
source[1].buffer = buffer[1]; 

var test = context.createScriptProcessor(4096, 2, 1); 

source[0].connect(test, 0, 0); 
source[1].connect(test, 0, 1); 

test.connect(context.destination); 

source[0].start(); 
source[1].start(); 

Wenn ich diesen Code in Google Chrome sowie in Mozilla Firefox ausführen, bekomme ich den folgenden Fehler ausgelöst. Es sagt mir, dass mein test Knoten nur einen Eingangskanal hat.

Uncaught IndexSizeError: Failed to execute 'connect' on 'AudioNode': input index (1) exceeds number of inputs (1). 

Wenn ich die Anzahl der Eingangskanäle des ScriptProcessorNode test I Eingangskanäle erhalten zwei Konsole aus.

test.onaudioprocess = function(evt){ 
    console.log("number of input channels: " + evt.inputBuffer.numberOfChannels); 
} 

Dennoch zwei Knoten an den Eingang des test Knoten verbinden, wie ich es tun nicht funktioniert. Ich möchte einen Vocoder innerhalb des ScriptProcessorNode programmieren. Wie kann ich einen ScriptProcessorNode mit zwei Eingangs- und einem Ausgangskanal erstellen und zwei Quellknoten als Eingangskanal und den context.destination als Ausgangskanal verbinden?

+0

https://developer.mozilla.org/en-US/docs/Web/API/ChannelMergerNode Haben Sie das berücksichtigt? –

+0

Ich brauche beide Eingangskanäle in der Funktion, die durch einen Onaudioprozess ausgelöst wird, um sie auf eine bestimmte Art und Weise miteinander zu verbinden. Ich könnte zwei ScriptProcessorNodes erstellen und sie später zusammenführen, aber ich weiß nicht, wie zwei ScriptProcessorNodes parallel ausgeführt werden. – thiloilg

+0

Was ich verstehe Sie zu sagen ist, dass Sie beide Kanäle getrennt verarbeiten möchten? In diesem Fall möchten Sie wahrscheinlich https://developer.mozilla.org/en-US/docs/Web/API/ChannelSplitterNode und zwei verschiedene 'ScriptProcessorNode's, um jeden Mono-Audio-Stream zu verarbeiten. –

Antwort

5

Der zweite Parameter von createScriptProcessor ist die Anzahl der Eingangskanäle für den einzelnen Eingang des Knotens, nicht die Anzahl der Eingänge für den Knoten.

Der Weg dazu ist ein ChannelMergerNode mit zwei Eingängen zu verwenden. Verbinden Sie Ihre beiden Quellen mit jedem der Eingänge des Merger-Knotens. Die Ausgabe der Verschmelzung sollte mit Ihrem Skriptprozessorknoten verbunden sein. Der onaudioprocess Callback erhält eine AudioBuffer, die zwei Kanäle enthält. Sie können diese beiden Kanäle dann wie gewünscht bearbeiten.

+0

Eine Sache, die ich über ".connect (_, _, inputIndex)" etwas abscheulich finde, ist, dass, wenn ich es richtig verstehe, der inputIndex ** nur ** zusammen mit speziell "ChannelMergerNode" verwendet werden kann. Alle anderen Knotentypen haben eine oder keine Eingaben. ChannelMergerNode ist der einzige Knotentyp mit mehr als 1 Eingabe. –

+0

Ja, das stimmte. Aber 'AudioWorklets' können mehr als eine Eingabe haben. –