Start · Sprachen · JavaScript · Referenz · ScriptProcessorNode.bufferSize

ScriptProcessorNode.bufferSize

Eigenschaft

Gibt die Größe des Eingabe- und Ausgabepuffers eines <code>ScriptProcessorNode</code> in Sample-Frames als ganze Zahl zurück (nur lesbar).

seit JavaScript Baseline: alle Browser (veraltet, durch AudioWorkl deprecated seit ja Kategorie: webapi

Signatur

ScriptProcessorNode.bufferSize

Beschreibung

Die schreibgeschützte Eigenschaft bufferSize liefert die Anzahl der Sample-Frames, die bei jedem Aufruf des audioprocess-Events verarbeitet werden müssen. Der Wert gilt gleichzeitig für den Eingabe- und den Ausgabepuffer und entspricht der Länge jedes Kanal-Arrays aus inputBuffer.getChannelData() bzw. outputBuffer.getChannelData().

Festgelegt wird die Größe beim Erzeugen des Knotens mit AudioContext.createScriptProcessor(bufferSize, inputChannels, outputChannels). Erlaubt sind Zweierpotenzen von 256 bis 16384 (256, 512, 1024, 2048, 4096, 8192, 16384). Übergibt man 0 oder lässt den Wert weg, wählt der Browser eine passende Größe selbst. An bufferSize lässt sich dann ablesen, welcher Wert tatsächlich gewählt wurde.

Die Puffergröße bestimmt den Kompromiss zwischen Latenz und Stabilität: Kleine Puffer bedeuten geringe Verzögerung, aber häufigere Event-Aufrufe im Haupt-Thread und damit ein höheres Risiko für Knackser (Buffer-Underruns). Große Puffer laufen stabiler, verzögern das Audiosignal aber spürbar. Die Latenz eines Puffers in Sekunden ergibt sich aus bufferSize / audioContext.sampleRate.

Rückgabewert

Typ
number
Beschreibung
Ganze Zahl: die Puffergröße in Sample-Frames (eine Zweierpotenz zwischen 256 und 16384).

Beispiele

Vom Browser gewählte Puffergröße auslesen

const audioCtx = new AudioContext();
// 0 = der Browser wählt die Puffergröße selbst
const processor = audioCtx.createScriptProcessor(0, 1, 1);

console.log(`Puffergröße: ${processor.bufferSize} Frames`);
const latenzMs = (processor.bufferSize / audioCtx.sampleRate) * 1000;
console.log(`Latenz pro Puffer: ${latenzMs.toFixed(1)} ms`);
Puffergröße: 1024 Frames Latenz pro Puffer: 21.3 ms (Werte hängen von Browser und Sample-Rate ab)

Pegelmessung (RMS) pro Puffer

const audioCtx = new AudioContext();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const source = audioCtx.createMediaStreamSource(stream);
const processor = audioCtx.createScriptProcessor(2048, 1, 1);

processor.onaudioprocess = (event) => {
  const input = event.inputBuffer.getChannelData(0);
  let summe = 0;
  // Das Array hat genau bufferSize Einträge
  for (let i = 0; i < processor.bufferSize; i++) {
    summe += input[i] * input[i];
  }
  const rms = Math.sqrt(summe / processor.bufferSize);
  console.log(`Pegel: ${rms.toFixed(3)}`);
};

source.connect(processor);
processor.connect(audioCtx.destination);
Pegel: 0.012 Pegel: 0.087 ...

Weißes Rauschen erzeugen und Puffergröße prüfen

const audioCtx = new AudioContext();
const processor = audioCtx.createScriptProcessor(4096, 0, 2);

processor.addEventListener('audioprocess', ({ outputBuffer }) => {
  for (let ch = 0; ch < outputBuffer.numberOfChannels; ch++) {
    const data = outputBuffer.getChannelData(ch);
    console.assert(data.length === processor.bufferSize);
    for (let i = 0; i < data.length; i++) {
      data[i] = (Math.random() * 2 - 1) * 0.1; // leises Rauschen
    }
  }
});

processor.connect(audioCtx.destination);
console.log(processor.bufferSize);
4096

// Wichtig · Fallstricke

  • Veraltet: ScriptProcessorNode ist in der Web-Audio-Spezifikation als veraltet markiert, funktioniert aber weiterhin in allen gängigen Browsern. Für neue Projekte besser AudioWorkletNode verwenden. Dort wird Audio in einem eigenen Thread in festen Blöcken zu 128 Frames verarbeitet.
  • Nur lesbar: Eine Zuweisung an bufferSize wird ignoriert (im Strict Mode gibt es einen TypeError). Wer eine andere Größe braucht, muss einen neuen Knoten erzeugen.
  • Ungültige Werte: Übergibt man createScriptProcessor() einen Wert, der keine erlaubte Zweierpotenz ist (z. B. 1000), wird ein IndexSizeError ausgelöst.
  • Performance: Die Verarbeitung läuft im Haupt-Thread. Bei kleinen Puffern (256/512) führen aufwändiges Rendering oder die Garbage Collection schnell zu Aussetzern im Ton. Im Zweifel 0 übergeben und den Browser wählen lassen.
  • Die Anfangslatenz kann größer sein als ein einzelner Puffer, weil Browser intern oft doppelt puffern.