Signatur
Beschreibung
Der Konstruktor new AudioBuffer() erzeugt einen Audiopuffer im Arbeitsspeicher, also eine Folge von PCM-Samples im 32-Bit-Gleitkommaformat, getrennt nach Kanälen. Anfangs enthalten alle Samples den Wert 0, der Puffer ist also still. Die Daten schreibt man anschließend über getChannelData() oder copyToChannel() hinein.
Ein AudioBuffer ist nicht an einen bestimmten AudioContext gebunden. Man kann ihn also schon vorab erzeugen und später in einem beliebigen Kontext mit einer AudioBufferSourceNode abspielen oder einer ConvolverNode als Impulsantwort übergeben. Stimmt die Abtastrate des Puffers nicht mit der des Kontexts überein, rechnet der Browser beim Abspielen automatisch um.
Typische Anwendungsfälle sind synthetisch erzeugte Klänge (Rauschen, Sinustöne, Klicks), kurze Soundeffekte, Impulsantworten für Hall oder das Zusammenstellen und Weiterbearbeiten von Audiodaten. Ältere Code-Beispiele nutzen dafür oft AudioContext.createBuffer(). Das Ergebnis ist dasselbe, der Konstruktor braucht aber keinen Kontext.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options Pflicht | Object | Konfigurationsobjekt mit den Eigenschaften length, sampleRate und optional numberOfChannels. |
|
| $options.length Pflicht | number | Länge des Puffers in Sample-Frames. Muss mindestens 1 sein. Die Dauer in Sekunden ergibt sich aus length / sampleRate. |
|
| $options.sampleRate Pflicht | number | Abtastrate in Hz. Browser müssen mindestens den Bereich 8000–96000 unterstützen, viele erlauben 3000–768000. | |
| $options.numberOfChannels | number | 1 | Anzahl der Audiokanäle, z. B. 1 für Mono und 2 für Stereo. Mindestens 32 Kanäle müssen möglich sein. |
Rückgabewert
AudioBuffer-Objekt, dessen Samples alle mit 0 (Stille) belegt sind.Beispiele
Leeren Stereo-Puffer anlegen und Eigenschaften prüfen
// 2 Sekunden Stereo bei 44,1 kHz
const buffer = new AudioBuffer({
numberOfChannels: 2,
length: 44100 * 2,
sampleRate: 44100
});
console.log(buffer.numberOfChannels);
console.log(buffer.length);
console.log(buffer.duration);
console.log(buffer.getChannelData(0)[0]);
Weißes Rauschen erzeugen und abspielen
const ctx = new AudioContext();
const noise = new AudioBuffer({
length: ctx.sampleRate, // 1 Sekunde
sampleRate: ctx.sampleRate
});
// Samples zwischen -1 und 1 zufällig befüllen
const data = noise.getChannelData(0);
for (let i = 0; i < data.length; i++) {
data[i] = Math.random() * 2 - 1;
}
document.querySelector('#play').addEventListener('click', async () => {
await ctx.resume(); // Autoplay-Sperre aufheben
const source = new AudioBufferSourceNode(ctx, { buffer: noise });
source.connect(ctx.destination);
source.start();
});
Sinuston (440 Hz) mit copyToChannel schreiben
const sampleRate = 48000;
const seconds = 0.5;
const frequency = 440;
const tone = new AudioBuffer({
numberOfChannels: 2,
length: sampleRate * seconds,
sampleRate
});
const samples = new Float32Array(tone.length);
for (let i = 0; i < samples.length; i++) {
samples[i] = 0.3 * Math.sin(2 * Math.PI * frequency * i / sampleRate);
}
// dieselben Daten in beide Kanäle kopieren
tone.copyToChannel(samples, 0);
tone.copyToChannel(samples, 1);
console.log(tone.duration.toFixed(2));
// Wichtig · Fallstricke
- Pflichtfelder: Fehlen
lengthodersampleRate, wirft der Konstruktor einenTypeError. Beilength: 0, einer nicht unterstützten Abtastrate oder einer ungültigen Kanalanzahl kommt einNotSupportedError(DOMException). - Wertebereich: Samples sollten zwischen
-1.0und1.0liegen. Werte außerhalb dieses Bereichs werden bei der Ausgabe abgeschnitten und klingen verzerrt. - Speicherbedarf: Jedes Sample braucht 4 Byte. Eine Minute Stereo bei 48 kHz sind schon rund 23 MB. Lange Audiodateien daher lieber mit einem
<audio>-Element undMediaElementAudioSourceNodestreamen. - Dateien laden: Für MP3, WAV oder OGG nimmt man nicht diesen Konstruktor, sondern
AudioContext.decodeAudioData(). - Autoplay: Den Puffer kann man jederzeit erzeugen. Abspielen klappt in den meisten Browsern aber erst nach einer Nutzeraktion, z. B. einem Klick.
- Kompatibilität: Den Konstruktor gibt es in allen aktuellen Browsern (Chrome 55+, Firefox 53+, Safari 14.1+). Für sehr alte Browser ist
AudioContext.createBuffer()der Ersatz.