Signatur
Beschreibung
Die Eigenschaft decodeQueueSize gibt an, wie viele Aufrufe von AudioDecoder.decode() in der internen Warteschlange des Decoders stehen und noch nicht an den zugrunde liegenden Codec übergeben wurden. Jeder decode()-Aufruf erhöht den Wert um eins. Sobald der Decoder eine Anforderung übernimmt, sinkt der Wert wieder.
Wichtig ist die Eigenschaft vor allem für Gegendruck (Backpressure). Wer Audiodaten schneller in decode() schiebt, als der Codec sie verarbeiten kann, füllt den Speicher und erhöht die Latenz. Deshalb prüft man decodeQueueSize vor dem Einreihen weiterer Chunks. Zusammen mit dem Ereignis dequeue lässt sich so eine Zufuhr bauen, die sich selbst regelt.
Der Wert ist rein informativ. Er wird asynchron aktualisiert, und zwar immer dann, wenn der Decoder Arbeit aus der Warteschlange nimmt. Nach reset() oder close() ist er 0.
Rückgabewert
Beispiele
Warteschlangengröße nach decode() auslesen
const decoder = new AudioDecoder({
output: (audioData) => {
console.log('Dekodiert:', audioData.numberOfFrames, 'Frames');
audioData.close();
},
error: (e) => console.error('Decoder-Fehler:', e)
});
decoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 2 });
// Codierte Opus-Pakete, z. B. aus einem Demuxer
const packets = [new Uint8Array([0xfc, 0xff, 0xfe]), new Uint8Array([0xfc, 0xff, 0xfe])];
let timestamp = 0;
for (const data of packets) {
decoder.decode(new EncodedAudioChunk({ type: 'key', timestamp, data }));
timestamp += 20000; // 20 ms in Mikrosekunden
}
console.log('Ausstehend:', decoder.decodeQueueSize);
Gegendruck mit dem dequeue-Ereignis
const MAX_QUEUE = 10;
const feedDecoder = (decoder, chunks) => {
let index = 0;
const pump = () => {
// Nur nachliefern, solange die Warteschlange klein genug ist
while (index < chunks.length && decoder.decodeQueueSize < MAX_QUEUE) {
decoder.decode(chunks[index++]);
}
if (index >= chunks.length) {
decoder.removeEventListener('dequeue', pump);
decoder.flush().then(() => console.log('Alle Chunks dekodiert'));
}
};
decoder.addEventListener('dequeue', pump);
pump();
};
Asynchrones Warten, bis die Warteschlange abgebaut ist
const waitForQueue = (decoder, limit) =>
new Promise((resolve) => {
if (decoder.decodeQueueSize <= limit) return resolve();
const onDequeue = () => {
if (decoder.decodeQueueSize <= limit) {
decoder.removeEventListener('dequeue', onDequeue);
resolve();
}
};
decoder.addEventListener('dequeue', onDequeue);
});
const decodeAll = async (decoder, chunks) => {
for (const chunk of chunks) {
await waitForQueue(decoder, 5);
decoder.decode(chunk);
}
await decoder.flush();
console.log('Fertig, Warteschlange:', decoder.decodeQueueSize);
};
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wird still ignoriert bzw. wirft im Strict Mode einen
TypeError. - Kein Maß für fertige Ausgabe: Der Wert zählt nur Anforderungen, die noch nicht an den Codec übergeben wurden. Wenn
0steht, können trotzdem noch Frames in Arbeit sein. Um sicher zu gehen, dass alle Ausgaben da sind, aufflush()warten. - Kein Polling: Statt den Wert mit
setIntervalabzufragen, das Ereignisdequeuenutzen (addEventListener('dequeue', …)oderondequeue). - Nach
reset()oderclose()ist der Wert0, und ausstehende Anforderungen werden verworfen. - Kompatibilität: Die WebCodecs API gibt es nur in sicheren Kontexten (HTTPS), im Fenster und in Dedicated Workers. Vor der Nutzung mit
'AudioDecoder' in globalThisprüfen. Die Unterstützung in Firefox und Safari ist jünger als in Chromium-Browsern.