Signatur
Beschreibung
Die Methode flush() der Schnittstelle AudioDecoder zwingt den Decoder, alle noch in der internen Warteschlange liegenden EncodedAudioChunk-Objekte zu verarbeiten. Das zurückgegebene Promise wird erst aufgelöst, wenn für jeden bis dahin mit decode() übergebenen Chunk der output-Callback aufgerufen wurde.
Typische Einsatzfälle sind das Ende eines Datenstroms (letzte Frames sollen nicht verloren gehen), das Umschalten der Konfiguration per configure() oder das saubere Beenden, bevor close() aufgerufen wird. Viele Decoder puffern intern einige Frames; ohne flush() erhält man diese letzten Ausgaben unter Umständen nie.
Nach einem flush() erwartet der Decoder als nächsten Chunk einen Schlüssel-Chunk (type: "key"). Die Methode ist nur gültig, wenn der Decoder im Zustand "configured" ist; andernfalls wird das Promise mit einem InvalidStateError abgelehnt.
Rückgabewert
Promise, das mit undefined aufgelöst wird, sobald alle ausstehenden Dekodier-Aufträge abgeschlossen und ausgegeben sind. Es wird abgelehnt, wenn der Decoder nicht konfiguriert ist, während des Flushens reset()/close() aufgerufen wird oder ein Dekodierfehler auftritt.Beispiele
Letzte Frames am Stream-Ende abholen
const frames = [];
const decoder = new AudioDecoder({
output: (audioData) => {
frames.push(audioData.numberOfFrames);
audioData.close(); // Speicher freigeben
},
error: (e) => console.error('Dekodierfehler:', e)
});
decoder.configure({
codec: 'opus',
sampleRate: 48000,
numberOfChannels: 2
});
// encodedChunks: Array von EncodedAudioChunk, z. B. aus einem Demuxer
const decodeAll = async (encodedChunks) => {
for (const chunk of encodedChunks) {
decoder.decode(chunk);
}
await decoder.flush(); // wartet, bis alle Ausgaben geliefert sind
console.log(`Fertig: ${frames.length} AudioData-Blöcke`);
decoder.close();
};
Konfiguration sicher wechseln
const switchConfig = async (decoder, newConfig) => {
// Ausstehende Chunks mit alter Konfiguration abschließen
await decoder.flush();
const { supported } = await AudioDecoder.isConfigSupported(newConfig);
if (!supported) throw new Error('Konfiguration nicht unterstützt');
decoder.configure(newConfig);
// Danach muss ein Schlüssel-Chunk (type: 'key') folgen
};
Fehlerbehandlung bei falschem Zustand
const decoder = new AudioDecoder({
output: (d) => d.close(),
error: (e) => console.error(e)
});
try {
await decoder.flush(); // noch nicht konfiguriert
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Zustand prüfen: Im Zustand
"unconfigured"oder"closed"wird das Promise mitInvalidStateErrorabgelehnt. Wird während des Flushensreset()oderclose()aufgerufen, wird es mitAbortErrorabgelehnt. - Schlüssel-Chunk erforderlich: Nach
flush()muss der nächste andecode()übergebene Chunk vom Typ"key"sein, sonst wird einDataErrorgeworfen. - Nicht ständig flushen:
flush()leert interne Puffer und kann die Pipeline ausbremsen. Für Gegendruck besserdecodeQueueSizeund dasdequeue-Event nutzen. - Speicher: Jedes ausgegebene
AudioDatamuss mitclose()freigegeben werden. - Kompatibilität: WebCodecs ist nur in sicheren Kontexten (HTTPS) und in Window sowie dedizierten Workern verfügbar; Firefox und Safari unterstützen
AudioDecodererst seit neueren Versionen. Vorher per'AudioDecoder' in globalThisprüfen.