Start · Sprachen · JavaScript · Referenz · BaseAudioContext.createBuffer()

BaseAudioContext.createBuffer()

Methode

Erzeugt ein neues, mit Stille (Nullen) gefülltes <code>AudioBuffer</code>-Objekt mit festgelegter Kanalzahl, Länge in Samples und Abtastrate.

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

Signatur

BaseAudioContext.prototype.createBuffer(numberOfChannels, length, sampleRate)

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

Typ
AudioBuffer
Beschreibung
Ein neuer 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);
2 2

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`);
Länge: 48000 Samples, Dauer: 1 s (bei 48 kHz Kontext-Abtastrate)

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));
2.5

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]);
0.5

// Wichtig · Fallstricke

  • Fehler: Ist numberOfChannels oder length gleich 0 oder liegt sampleRate außerhalb des unterstützten Bereichs, wirft die Methode einen NotSupportedError (DOMException). Sehr große Längen können einen RangeError auslösen oder den Speicher sprengen.
  • Speicherbedarf: Ein Puffer belegt Kanäle × Länge × 4 Bytes. Eine Minute Stereo bei 48 kHz sind rund 23 MB. Für lange Aufnahmen solltest du lieber MediaElementAudioSourceNode oder Streaming nutzen.
  • Wertebereich: Samples außerhalb von −1.0 bis 1.0 werden am Ausgang abgeschnitten (Clipping). Pegel also vorher skalieren.
  • Einmalige Wiedergabe: Ein AudioBufferSourceNode lässt sich nur einmal starten. Der AudioBuffer selbst ist aber wiederverwendbar: Erzeuge pro Wiedergabe eine neue Quelle.
  • Autoplay: Browser starten einen AudioContext oft im Zustand suspended. Rufe resume() 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.