Start · Sprachen · JavaScript · Referenz · AudioBuffer.getChannelData()

AudioBuffer.getChannelData()

Methode

Gibt ein <code>Float32Array</code> mit den PCM-Rohdaten (Samples zwischen -1 und 1) des angegebenen Kanals eines <code>AudioBuffer</code> zurück.

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

Signatur

AudioBuffer.prototype.getChannelData(channel)

Beschreibung

getChannelData() liefert direkten Zugriff auf die Audiodaten eines Kanals in einem AudioBuffer. Die Werte liegen als lineares PCM im 32-Bit-Gleitkommaformat vor, üblicherweise im Bereich -1.0 bis 1.0. Der Index 0 steht für den ersten Kanal (bei Stereo: links), 1 für den zweiten (rechts) usw.

Das zurückgegebene Float32Array ist keine Kopie, sondern eine Sicht auf den internen Speicher des Puffers. Änderungen am Array wirken sich also direkt auf den Klang aus. Damit lassen sich Klänge programmatisch erzeugen (Rauschen, Sinustöne), Samples bearbeiten (Normalisieren, Fade-in/-out, Umkehren) oder analysieren (Wellenform-Darstellung, Pegelmessung).

Die Länge des Arrays entspricht AudioBuffer.length (Anzahl Sample-Frames). Zusammen mit sampleRate ergibt sich daraus die Dauer: length / sampleRate Sekunden.

Parameter

Name Typ Default Beschreibung
$channel Pflicht number Nullbasierter Index des Kanals. Muss kleiner als AudioBuffer.numberOfChannels sein.

Rückgabewert

Typ
Float32Array
Beschreibung
Ein Float32Array mit buffer.length Einträgen, das direkt auf die PCM-Daten des Kanals verweist.

Beispiele

Weißes Rauschen erzeugen und abspielen

const ctx = new AudioContext();
const buffer = ctx.createBuffer(2, ctx.sampleRate * 2, ctx.sampleRate); // 2 s Stereo

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; // Werte zwischen -1 und 1
  }
}

const source = ctx.createBufferSource();
source.buffer = buffer;
source.connect(ctx.destination);
source.start();

Spitzenpegel einer Audiodatei ermitteln

const ctx = new AudioContext();
const response = await fetch('/audio/sample.mp3');
const audioBuffer = await ctx.decodeAudioData(await response.arrayBuffer());

const left = audioBuffer.getChannelData(0);
let peak = 0;
for (const sample of left) {
  peak = Math.max(peak, Math.abs(sample));
}
console.log(`Spitzenpegel: ${(20 * Math.log10(peak)).toFixed(2)} dBFS`);
Spitzenpegel: -1.23 dBFS

Fade-out auf die letzte Sekunde anwenden

const applyFadeOut = (buffer, seconds = 1) => {
  const fadeLength = Math.min(buffer.length, Math.floor(buffer.sampleRate * seconds));
  const start = buffer.length - fadeLength;
  for (let ch = 0; ch < buffer.numberOfChannels; ch++) {
    const data = buffer.getChannelData(ch);
    for (let i = 0; i < fadeLength; i++) {
      data[start + i] *= 1 - i / fadeLength;
    }
  }
  return buffer;
};

const ctx = new OfflineAudioContext(1, 44100, 44100);
const buf = ctx.createBuffer(1, 44100, 44100);
buf.getChannelData(0).fill(0.5);
applyFadeOut(buf, 0.5);
console.log(buf.getChannelData(0)[44099].toFixed(4));
0.0000

// Wichtig · Fallstricke

  • Ungültiger Index: Ist channel größer oder gleich numberOfChannels, wird ein IndexSizeError (DOMException) geworfen.
  • Keine Kopie: Das Array verweist auf den internen Speicher. Wer die Originaldaten erhalten will, kopiert mit new Float32Array(data) oder nutzt copyFromChannel().
  • Während der Wiedergabe: Änderungen, nachdem der Puffer einem laufenden AudioBufferSourceNode zugewiesen wurde, werden laut Spezifikation nicht garantiert übernommen (Browser kopieren die Daten ggf. intern). Daten daher vor source.buffer = … befüllen.
  • Performance: Bei großen Puffern Schleifen über typisierte Arrays statt Array.from() oder Spread-Operator nutzen; für Echtzeitverarbeitung besser einen AudioWorklet verwenden.
  • Werte außerhalb von -1 bis 1 werden bei der Ausgabe abgeschnitten (Clipping).
  • Unterstützt in allen modernen Browsern; im alten Safari nur über webkitAudioContext.