Signatur
Beschreibung
Das dequeue-Ereignis der Schnittstelle AudioDecoder signalisiert, dass der Decoder einen oder mehrere zuvor per decode() übergebene EncodedAudioChunk-Objekte aus seiner internen Warteschlange entnommen hat. Dadurch ist AudioDecoder.decodeQueueSize gesunken. Es handelt sich um ein einfaches Event ohne zusätzliche Eigenschaften und es steigt nicht im Baum auf (keine Bubbling-Phase).
Der wichtigste Einsatzzweck ist die Gegendrucksteuerung (Backpressure): Statt alle Chunks auf einmal in den Decoder zu schieben und dadurch viel Speicher zu belegen, übergibt man nur so viele, bis decodeQueueSize einen Schwellwert erreicht, und wartet danach auf dequeue, um weitere Daten nachzuschieben. Das ersetzt aufwendiges Polling mit setTimeout.
Man registriert den Handler entweder per addEventListener("dequeue", handler) oder über die Eigenschaft ondequeue. Der Browser kann mehrere Entnahmen zu einem einzigen Ereignis zusammenfassen – man sollte also im Handler immer den aktuellen Wert von decodeQueueSize lesen und nicht davon ausgehen, dass pro Ereignis genau ein Chunk verarbeitet wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignistyp, hier immer "dequeue". |
|
| $handler Pflicht | (event: Event) => void | Callback, der mit einem einfachen Event-Objekt aufgerufen wird. event.target ist der auslösende AudioDecoder. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie once oder signal (zum Entfernen per AbortController). |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein Event ohne zusätzliche Daten.Beispiele
Warteschlangengröße per addEventListener beobachten
const decoder = new AudioDecoder({
output: (audioData) => {
// Dekodierte Samples weiterverarbeiten
audioData.close();
},
error: (e) => console.error('Decoder-Fehler:', e)
});
decoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 2 });
decoder.addEventListener('dequeue', () => {
console.log('Verbleibend in der Warteschlange:', decoder.decodeQueueSize);
});
Backpressure: Chunks nur bei freier Kapazität nachschieben
const MAX_QUEUE = 8;
const decodeAll = async (decoder, chunks) => {
// Wartet, bis der Decoder wieder Platz hat
const waitForDequeue = () =>
new Promise((resolve) =>
decoder.addEventListener('dequeue', resolve, { once: true })
);
for (const chunk of chunks) {
while (decoder.decodeQueueSize >= MAX_QUEUE) {
await waitForDequeue();
}
decoder.decode(chunk);
}
await decoder.flush();
console.log('Alle Chunks dekodiert');
};
ondequeue-Eigenschaft setzen und wieder entfernen
const decoder = new AudioDecoder({
output: (data) => data.close(),
error: console.error
});
decoder.ondequeue = () => {
if (decoder.decodeQueueSize === 0) {
console.log('Warteschlange leer – neue Daten anfordern');
}
};
// Später: Handler abmelden
decoder.ondequeue = null;
Listener per AbortController entfernen
const controller = new AbortController();
const onDequeue = () => console.log('Größe:', decoder.decodeQueueSize);
decoder.addEventListener('dequeue', onDequeue, { signal: controller.signal });
// Alternativ: decoder.removeEventListener('dequeue', onDequeue);
controller.abort();
// Wichtig · Fallstricke
- Zusammengefasste Ereignisse: Mehrere Entnahmen können ein einziges
dequeueauslösen. ImmerdecodeQueueSizeneu auslesen, nicht mitzählen. - Kein Hinweis auf fertige Ausgabe:
dequeuebedeutet nur, dass ein Chunk aus der Warteschlange übernommen wurde – die dekodiertenAudioData-Objekte kommen separat über denoutput-Callback. - Nach
close()oderreset(): Wartende Promises, die aufdequeuehoffen, können hängen bleiben. Bei Abbruch Listener entfernen bzw. Promises zusätzlich über denerror-Callback oder einAbortSignalauflösen. - Speicher:
AudioDataimoutput-Callback stets mitclose()freigeben, sonst staut sich der Decoder trotz Backpressure. - Kompatibilität: Die WebCodecs-API ist nur in sicheren Kontexten (HTTPS) und in Window sowie Dedicated Workern verfügbar.
AudioDecoderwird von Chromium-Browsern seit Version 94 unterstützt, von Firefox seit 130; Safari hat Audio-Unterstützung erst spät ergänzt. Vorher mit'AudioDecoder' in globalThisundAudioDecoder.isConfigSupported()prüfen.