Signatur
Beschreibung
createBuffer() legt einen leeren AudioBuffer im Arbeitsspeicher an, also einen Block aus PCM-Rohdaten (32-Bit-Gleitkommazahlen im Bereich −1.0 bis 1.0) für einen oder mehrere Kanäle. Anfangs enthalten alle Samples den Wert 0, das entspricht Stille.
Die Methode eignet sich, wenn du Audiodaten selbst erzeugen oder bearbeiten willst: synthetische Töne, weißes Rauschen, Impulsantworten für einen ConvolverNode, kurze Soundeffekte oder bereits dekodierte Daten, die du zusammenschneiden möchtest. Die Samples schreibst du über getChannelData() oder copyToChannel() hinein. Abgespielt wird der Puffer anschließend über einen AudioBufferSourceNode.
Die Länge wird in Sample-Frames angegeben, nicht in Sekunden. Die Dauer ergibt sich aus length / sampleRate. Für eine Sekunde Audio bei 44,1 kHz brauchst du also length = 44100. Weicht die Abtastrate des Puffers von der des Kontexts ab, rechnet der Browser beim Abspielen automatisch um (Resampling).
Willst du dagegen komprimierte Dateien wie MP3, OGG oder WAV laden, nimmst du decodeAudioData(). Einen Puffer ohne AudioContext erzeugt der Konstruktor new AudioBuffer({ length, sampleRate, numberOfChannels }).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $numberOfChannels Pflicht | number | Anzahl der Audiokanäle, z. B. 1 für Mono und 2 für Stereo. Jede Implementierung muss mindestens 32 Kanäle unterstützen. |
|
| $length Pflicht | number | Größe des Puffers in Sample-Frames. Muss mindestens 1 sein. Dauer in Sekunden = length / sampleRate. |
|
| $sampleRate Pflicht | number | Abtastrate in Hz, meist audioCtx.sampleRate. Laut Spezifikation muss mindestens der Bereich 8000 bis 96000 Hz unterstützt werden (Browser erlauben oft 3000 bis 768000 Hz). |
Rückgabewert
AudioBuffer mit den angegebenen Eigenschaften. Alle Samples stehen auf 0.Beispiele
Zwei Sekunden weißes Rauschen erzeugen und abspielen
const audioCtx = new AudioContext();
const dauer = 2; // Sekunden
const buffer = audioCtx.createBuffer(2, audioCtx.sampleRate * dauer, audioCtx.sampleRate);
// Jeden Kanal mit Zufallswerten zwischen -1 und 1 füllen
for (let kanal = 0; kanal < buffer.numberOfChannels; kanal++) {
const daten = buffer.getChannelData(kanal);
for (let i = 0; i < daten.length; i++) {
daten[i] = Math.random() * 2 - 1;
}
}
// Wiedergabe nur nach einer Nutzeraktion (Autoplay-Regeln)
document.querySelector('#play').addEventListener('click', async () => {
await audioCtx.resume();
const quelle = audioCtx.createBufferSource();
quelle.buffer = buffer;
quelle.connect(audioCtx.destination);
quelle.start();
});
console.log(buffer.duration, buffer.numberOfChannels);
Sinuston (440 Hz) synthetisieren
const audioCtx = new AudioContext();
const sr = audioCtx.sampleRate;
const buffer = audioCtx.createBuffer(1, sr, sr); // 1 Sekunde Mono
const daten = buffer.getChannelData(0);
const frequenz = 440;
for (let i = 0; i < daten.length; i++) {
daten[i] = 0.3 * Math.sin(2 * Math.PI * frequenz * (i / sr));
}
const quelle = new AudioBufferSourceNode(audioCtx, { buffer, loop: true });
quelle.connect(audioCtx.destination);
// quelle.start(); // z. B. in einem Klick-Handler aufrufen
console.log(`Länge: ${buffer.length} Samples, Dauer: ${buffer.duration} s`);
Impulsantwort für einen Hall-Effekt (ConvolverNode)
const audioCtx = new AudioContext();
const erzeugeImpulsantwort = (ctx, sekunden = 2.5, abfall = 3) => {
const laenge = Math.floor(ctx.sampleRate * sekunden);
const ir = ctx.createBuffer(2, laenge, ctx.sampleRate);
for (let k = 0; k < 2; k++) {
const d = ir.getChannelData(k);
for (let i = 0; i < laenge; i++) {
// Abklingendes Rauschen
d[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / laenge, abfall);
}
}
return ir;
};
const hall = new ConvolverNode(audioCtx, { buffer: erzeugeImpulsantwort(audioCtx) });
hall.connect(audioCtx.destination);
console.log(hall.buffer.duration.toFixed(1));
Offline-Rendering mit OfflineAudioContext
const offline = new OfflineAudioContext(1, 44100, 44100);
const buf = offline.createBuffer(1, 44100, 44100);
buf.getChannelData(0).fill(0.5); // konstantes Signal
const src = new AudioBufferSourceNode(offline, { buffer: buf });
src.connect(offline.destination);
src.start();
const ergebnis = await offline.startRendering();
console.log(ergebnis.getChannelData(0)[1000]);
// Wichtig · Fallstricke
- Fehler: Ist
numberOfChannelsoderlengthgleich0oder liegtsampleRateaußerhalb des unterstützten Bereichs, wirft die Methode einenNotSupportedError(DOMException). Sehr große Längen können einenRangeErrorauslösen oder den Speicher sprengen. - Speicherbedarf: Ein Puffer belegt
Kanäle × Länge × 4Bytes. Eine Minute Stereo bei 48 kHz sind rund 23 MB. Für lange Aufnahmen solltest du lieberMediaElementAudioSourceNodeoder Streaming nutzen. - Wertebereich: Samples außerhalb von −1.0 bis 1.0 werden am Ausgang abgeschnitten (Clipping). Pegel also vorher skalieren.
- Einmalige Wiedergabe: Ein
AudioBufferSourceNodelässt sich nur einmal starten. DerAudioBufferselbst ist aber wiederverwendbar: Erzeuge pro Wiedergabe eine neue Quelle. - Autoplay: Browser starten einen
AudioContextoft im Zustandsuspended. Ruferesume()nach einer Nutzerinteraktion auf. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Sehr alte WebKit-Versionen hatten ein Präfix (
webkitAudioContext) und erlaubten nur 22050 bis 96000 Hz.