Signatur
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
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`);
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);
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);
// Wichtig · Fallstricke
- Veraltet:
ScriptProcessorNodeist in der Web-Audio-Spezifikation als veraltet markiert, funktioniert aber weiterhin in allen gängigen Browsern. Für neue Projekte besserAudioWorkletNodeverwenden. Dort wird Audio in einem eigenen Thread in festen Blöcken zu 128 Frames verarbeitet. - Nur lesbar: Eine Zuweisung an
bufferSizewird ignoriert (im Strict Mode gibt es einenTypeError). 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 einIndexSizeErrorausgelö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.