Signatur
Beschreibung
Der Konstruktor AudioBufferSourceNode() erzeugt eine Audioquelle für die Web Audio API, die Audiodaten aus einem AudioBuffer abspielt. Das ist ideal für kurze, häufig genutzte Klänge wie Soundeffekte in Spielen, UI-Klicks oder Samples in Musik-Apps, weil die Daten bereits dekodiert im Arbeitsspeicher liegen und ohne Verzögerung abgespielt werden.
Anders als bei der älteren Fabrikmethode BaseAudioContext.createBufferSource() kannst du hier alle Einstellungen direkt über das options-Objekt übergeben, zum Beispiel buffer, loop, playbackRate oder detune. Beide Wege liefern das gleiche Ergebnis.
Wichtig: Ein AudioBufferSourceNode ist ein Wegwerf-Objekt. start() darf nur einmal aufgerufen werden. Soll ein Klang mehrfach abgespielt werden, erzeugst du jedes Mal einen neuen Knoten. Das ist gewollt und günstig, denn der eigentliche AudioBuffer kann beliebig oft wiederverwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $context Pflicht | BaseAudioContext | Der AudioContext oder OfflineAudioContext, zu dem der Knoten gehören soll. |
|
| $options | object | {} | Optionales Konfigurationsobjekt mit folgenden Eigenschaften:
|
Rückgabewert
AudioBufferSourceNode, der mit connect() in den Audio-Graphen eingebunden und mit start() abgespielt wird.Beispiele
Soundeffekt laden und abspielen
const ctx = new AudioContext();
const loadSound = async (url) => {
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
return ctx.decodeAudioData(arrayBuffer);
};
const playSound = (buffer) => {
// Für jede Wiedergabe einen neuen Knoten erzeugen
const source = new AudioBufferSourceNode(ctx, { buffer });
source.connect(ctx.destination);
source.start();
return source;
};
document.querySelector('#play').addEventListener('click', async () => {
await ctx.resume(); // Autoplay-Sperre aufheben
const clickBuffer = await loadSound('/sounds/click.mp3');
playSound(clickBuffer);
});
Hintergrundschleife mit Schleifenbereich und Tempo
const ctx = new AudioContext();
const response = await fetch('/audio/loop.wav');
const buffer = await ctx.decodeAudioData(await response.arrayBuffer());
const loop = new AudioBufferSourceNode(ctx, {
buffer,
loop: true,
loopStart: 1.0, // Schleife ab Sekunde 1
loopEnd: 3.0, // bis Sekunde 3
playbackRate: 1.25
});
loop.connect(ctx.destination);
loop.start(0, 1.0); // direkt bei Sekunde 1 beginnen
// Nach 10 Sekunden anhalten
loop.stop(ctx.currentTime + 10);
Weißes Rauschen synthetisch erzeugen
const ctx = new AudioContext();
const seconds = 2;
const noiseBuffer = new AudioBuffer({
numberOfChannels: 1,
length: ctx.sampleRate * seconds,
sampleRate: ctx.sampleRate
});
const data = noiseBuffer.getChannelData(0);
for (let i = 0; i < data.length; i++) {
data[i] = Math.random() * 2 - 1;
}
const noise = new AudioBufferSourceNode(ctx, { buffer: noiseBuffer });
const gain = new GainNode(ctx, { gain: 0.2 });
noise.connect(gain).connect(ctx.destination);
noise.addEventListener('ended', () => console.log('Rauschen beendet'));
noise.start();
// Wichtig · Fallstricke
- Nur einmal startbar: Ein zweiter Aufruf von
start()wirft einenInvalidStateError. Für jede Wiedergabe einen neuen Knoten erzeugen – denAudioBufferdagegen wiederverwenden. - Autoplay-Richtlinien: Browser starten einen
AudioContextoft im Zustand"suspended". Rufectx.resume()innerhalb einer Benutzeraktion (z. B. Klick) auf. - Buffer nur einmal setzbar: Wurde
buffereinmal auf einen Nicht-null-Wert gesetzt, führt eine erneute Zuweisung zu einemInvalidStateError. - Speicherbedarf: Dekodierte Audiodaten liegen unkomprimiert im Speicher (32-Bit-Float pro Sample und Kanal). Für lange Musikstücke besser
MediaElementAudioSourceNodemit einem<audio>-Element verwenden. - Kompatibilität: Die Konstruktor-Syntax wird von allen aktuellen Browsern unterstützt; ältere Safari-Versionen (vor 14.1) kennen nur
createBufferSource()und teils nurwebkitAudioContext. - Ist
loopEndkleiner oder gleichloopStartbzw.0, wird der gesamte Puffer als Schleife verwendet.