Start · Sprachen · JavaScript · Referenz · AudioBuffer.numberOfChannels

AudioBuffer.numberOfChannels

Eigenschaft

Gibt die Anzahl der diskreten Audiokanäle (z. B. 1 = Mono, 2 = Stereo) der im <code>AudioBuffer</code> gespeicherten PCM-Daten als Ganzzahl zurück.

seit JavaScript Baseline: alle modernen Browser (Web Audio API) Kategorie: webapi

Signatur

AudioBuffer.numberOfChannels

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

Typ
number
Beschreibung
Eine positive Ganzzahl (mindestens 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);
2

Ü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');
Kanäle: 2

// Wichtig · Fallstricke

  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wie buffer.numberOfChannels = 1 wird im nicht-strikten Modus stillschweigend ignoriert, im Strict Mode wirft sie einen TypeError. Für eine andere Kanalanzahl muss man einen neuen Puffer anlegen.
  • Gültige Kanalindizes für getChannelData() reichen von 0 bis numberOfChannels - 1. Größere Indizes lösen einen IndexSizeError aus.
  • Laut Spezifikation müssen Browser mindestens 32 Kanäle unterstützen. Wird beim Erzeugen 0 oder ein zu großer Wert übergeben, gibt es einen NotSupportedError.
  • 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.channelCount und 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äfix webkitAudioContext).