Signatur
Beschreibung
Der Konstruktor ChannelSplitterNode() erzeugt einen Knoten der Web Audio API, der ein Eingangssignal mit mehreren Kanälen (z. B. Stereo oder 5.1) in separate Mono-Ausgänge zerlegt. Ausgang 0 enthält den ersten Kanal (bei Stereo: links), Ausgang 1 den zweiten (rechts) und so weiter.
Typische Einsatzfälle sind die getrennte Bearbeitung einzelner Kanäle – etwa unterschiedliche Lautstärke oder Effekte für links und rechts, Kanaltausch, Pegelanzeigen pro Kanal oder die Analyse mit einem AnalyserNode je Kanal. Meist wird er zusammen mit einem ChannelMergerNode genutzt, der die Kanäle wieder zusammenführt.
Der Konstruktor ist die moderne Alternative zur Fabrikmethode BaseAudioContext.createChannelSplitter() und erlaubt, alle Optionen direkt beim Erzeugen zu setzen. Die Eigenschaften channelCountMode ("explicit") und channelInterpretation ("discrete") sind bei diesem Knoten fest vorgegeben; channelCount entspricht immer numberOfOutputs.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $context Pflicht | BaseAudioContext | Der AudioContext oder OfflineAudioContext, zu dem der Knoten gehören soll. |
|
| $options | Object | {} | Optionales Konfigurationsobjekt (ChannelSplitterOptions). |
| $options.numberOfOutputs | number | 6 | Anzahl der Ausgänge (= Kanäle), zwischen 1 und 32. Kanäle über dieser Anzahl werden verworfen; fehlende Kanäle liefern Stille. |
| $options.channelCount | number | numberOfOutputs | Muss gleich numberOfOutputs sein, sonst wird ein InvalidStateError ausgelöst. |
| $options.channelCountMode | string | "explicit" | Nur "explicit" ist erlaubt; andere Werte führen zu einem InvalidStateError. |
| $options.channelInterpretation | string | "discrete" | Nur "discrete" ist erlaubt; andere Werte führen zu einem InvalidStateError. |
Rückgabewert
ChannelSplitterNode-Instanz mit einem Eingang und numberOfOutputs Mono-Ausgängen.Beispiele
Stereo-Splitter erzeugen
const ctx = new AudioContext();
const splitter = new ChannelSplitterNode(ctx, { numberOfOutputs: 2 });
console.log(splitter.numberOfInputs); // 1
console.log(splitter.numberOfOutputs); // 2
console.log(splitter.channelCountMode); // "explicit"
Linken und rechten Kanal getrennt regeln
const ctx = new AudioContext();
const audio = document.querySelector('audio');
const source = new MediaElementAudioSourceNode(ctx, { mediaElement: audio });
const splitter = new ChannelSplitterNode(ctx, { numberOfOutputs: 2 });
const merger = new ChannelMergerNode(ctx, { numberOfInputs: 2 });
const leftGain = new GainNode(ctx, { gain: 1.0 });
const rightGain = new GainNode(ctx, { gain: 0.3 });
source.connect(splitter);
// Ausgang 0 = links, Ausgang 1 = rechts
splitter.connect(leftGain, 0);
splitter.connect(rightGain, 1);
// Wieder zu Stereo zusammenführen
leftGain.connect(merger, 0, 0);
rightGain.connect(merger, 0, 1);
merger.connect(ctx.destination);
document.querySelector('#play').addEventListener('click', async () => {
await ctx.resume();
audio.play();
});
Pegelanzeige pro Kanal mit AnalyserNode
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { frequency: 440 });
const panner = new StereoPannerNode(ctx, { pan: -0.8 }); // stark nach links
const splitter = new ChannelSplitterNode(ctx, { numberOfOutputs: 2 });
const analysers = [0, 1].map(() => new AnalyserNode(ctx, { fftSize: 256 }));
osc.connect(panner).connect(splitter);
analysers.forEach((a, i) => splitter.connect(a, i));
osc.start();
const rms = (analyser) => {
const data = new Float32Array(analyser.fftSize);
analyser.getFloatTimeDomainData(data);
return Math.sqrt(data.reduce((s, v) => s + v * v, 0) / data.length);
};
setTimeout(() => {
console.log('Links:', rms(analysers[0]).toFixed(2));
console.log('Rechts:', rms(analysers[1]).toFixed(2));
}, 500);
// Wichtig · Fallstricke
- Standardwert von
numberOfOutputsist 6, nicht 2 – bei Stereo-Material sollte man den Wert explizit setzen, um unnötige, stille Ausgänge zu vermeiden. - Werte außerhalb von 1–32 lösen einen
IndexSizeErroraus; abweichende Werte fürchannelCount,channelCountModeoderchannelInterpretationeinenInvalidStateError. - Beim Verbinden muss der Ausgangsindex als zweites Argument von
connect()angegeben werden (splitter.connect(ziel, 1)); ohne Angabe wird nur Ausgang 0 verbunden. - Jeder Ausgang ist mono. Wird ein Ausgang direkt mit
ctx.destinationverbunden, wird das Signal hochgemischt und auf beiden Lautsprechern hörbar. - Browser-Kompatibilität: Der Konstruktor wird von allen aktuellen Browsern unterstützt; in sehr alten Safari-Versionen steht nur
createChannelSplitter()zur Verfügung. - Ein
AudioContextstartet wegen Autoplay-Richtlinien oft im Zustand"suspended"und muss per Benutzergeste mitresume()gestartet werden.