Signatur
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
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`);
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));
// Wichtig · Fallstricke
- Ungültiger Index: Ist
channelgrößer oder gleichnumberOfChannels, wird einIndexSizeError(DOMException) geworfen. - Keine Kopie: Das Array verweist auf den internen Speicher. Wer die Originaldaten erhalten will, kopiert mit
new Float32Array(data)oder nutztcopyFromChannel(). - Während der Wiedergabe: Änderungen, nachdem der Puffer einem laufenden
AudioBufferSourceNodezugewiesen wurde, werden laut Spezifikation nicht garantiert übernommen (Browser kopieren die Daten ggf. intern). Daten daher vorsource.buffer = …befüllen. - Performance: Bei großen Puffern Schleifen über typisierte Arrays statt
Array.from()oder Spread-Operator nutzen; für Echtzeitverarbeitung besser einenAudioWorkletverwenden. - 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.