Signatur
Beschreibung
Die schreibgeschützte Eigenschaft numberOfChannels eines AudioBuffer gibt an, wie viele getrennte Audiokanäle der Puffer enthält. Ein Wert von 1 steht für Mono, 2 für Stereo, 6 etwa für 5.1-Surround. Jeder Kanal ist intern ein eigenes Float32Array mit length Abtastwerten.
Man braucht die Eigenschaft vor allem dann, wenn man die Rohdaten eines Puffers verarbeiten will, also in einer Schleife über alle Kanäle mit getChannelData(kanal), copyFromChannel() oder copyToChannel() zugreift. Außerdem hilft sie dabei, einen neuen Puffer mit derselben Kanalanzahl anzulegen, etwa beim Kopieren, Zuschneiden oder Umkehren von Audiodaten.
Festgelegt wird der Wert beim Erzeugen des Puffers: über den Konstruktor new AudioBuffer({ numberOfChannels, length, sampleRate }), über BaseAudioContext.createBuffer() oder beim Dekodieren mit decodeAudioData(). Danach lässt er sich nicht mehr ändern.
Rückgabewert
1) mit der Anzahl der Kanäle im Puffer.Beispiele
Kanalanzahl eines neu erzeugten Puffers abfragen
const ctx = new AudioContext();
// Stereo-Puffer mit 2 Sekunden Länge
const buffer = ctx.createBuffer(2, ctx.sampleRate * 2, ctx.sampleRate);
console.log(buffer.numberOfChannels);
Über alle Kanäle iterieren und weißes Rauschen erzeugen
const ctx = new AudioContext();
const buffer = new AudioBuffer({
numberOfChannels: 2,
length: ctx.sampleRate,
sampleRate: ctx.sampleRate
});
for (let ch = 0; ch < buffer.numberOfChannels; ch++) {
const data = buffer.getChannelData(ch);
for (let i = 0; i < data.length; i++) {
data[i] = Math.random() * 2 - 1;
}
}
const source = new AudioBufferSourceNode(ctx, { buffer });
source.connect(ctx.destination);
source.start();
Geladene Audiodatei analysieren und rückwärts abspielen
const ctx = new AudioContext();
const playReversed = async (url) => {
const response = await fetch(url);
const original = await ctx.decodeAudioData(await response.arrayBuffer());
console.log(`Kanäle: ${original.numberOfChannels}`);
// Kopie mit gleicher Kanalanzahl anlegen
const reversed = new AudioBuffer({
numberOfChannels: original.numberOfChannels,
length: original.length,
sampleRate: original.sampleRate
});
for (let ch = 0; ch < original.numberOfChannels; ch++) {
const samples = original.getChannelData(ch).slice().reverse();
reversed.copyToChannel(samples, ch);
}
const source = new AudioBufferSourceNode(ctx, { buffer: reversed });
source.connect(ctx.destination);
source.start();
};
playReversed('/audio/sample.mp3');
// Wichtig · Fallstricke
- Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wie
buffer.numberOfChannels = 1wird im nicht-strikten Modus stillschweigend ignoriert, im Strict Mode wirft sie einenTypeError. Für eine andere Kanalanzahl muss man einen neuen Puffer anlegen. - Gültige Kanalindizes für
getChannelData()reichen von0bisnumberOfChannels - 1. Größere Indizes lösen einenIndexSizeErroraus. - Laut Spezifikation müssen Browser mindestens 32 Kanäle unterstützen. Wird beim Erzeugen
0oder ein zu großer Wert übergeben, gibt es einenNotSupportedError. decodeAudioData()übernimmt die Kanalanzahl der Quelldatei. Man sollte also nicht fest mit Stereo rechnen, denn Mono-Dateien sind häufig.- Die Kanalanzahl des Puffers ist unabhängig von
AudioNode.channelCountund der Ausgabe-Hardware. Beim Abspielen werden die Kanäle automatisch hoch- oder heruntergemischt (Up-/Downmixing). - Wird ein Puffer per
transfer()oder als übertragbares Objekt (Transferable) an einen Worker weitergegeben, ist er danach im Ursprungskontext nicht mehr nutzbar (detached). Die Eigenschaft wird in allen modernen Browsern unterstützt, auch in Safari (früher mit PräfixwebkitAudioContext).