Signatur
Beschreibung
Die Methode reset() der Schnittstelle AudioEncoder setzt den gesamten internen Zustand des Encoders zurück. Dazu gehören die aktuelle Konfiguration, alle Steuerungsnachrichten in der Warteschlange (etwa noch nicht verarbeitete encode()-Aufrufe) und alle ausstehenden Rückrufe. Danach ist state gleich "unconfigured" und encodeQueueSize gleich 0.
Anders als close() ist reset() nicht endgültig: Dieselbe Instanz lässt sich danach mit configure() neu einrichten und weiterverwenden. Das braucht man vor allem, wenn:
- man mitten in einer Aufnahme auf einen anderen Codec, eine andere Bitrate oder Abtastrate wechseln will,
- der Nutzer eine Aufnahme abbricht und die schon eingereihten Frames nicht mehr kodiert werden sollen,
- bei einem Seek oder Neustart ein Stream ohne Altlasten neu beginnen soll.
Alle noch offenen Promises von flush() werden mit einer DOMException vom Typ AbortError abgelehnt. Kodierte Chunks, die bereits an den output-Callback gegangen sind, bleiben gültig. Für noch nicht verarbeitete Frames wird dagegen keine Ausgabe mehr erzeugt.
Rückgabewert
state gleich "unconfigured".Beispiele
Encoder zurücksetzen und Zustand prüfen
const encoder = new AudioEncoder({
output: (chunk) => console.log('Chunk:', chunk.byteLength, 'Bytes'),
error: (e) => console.error('Encoder-Fehler:', e)
});
encoder.configure({
codec: 'opus',
sampleRate: 48000,
numberOfChannels: 1,
bitrate: 64000
});
console.log(encoder.state);
encoder.reset();
console.log(encoder.state);
console.log(encoder.encodeQueueSize);
Bitrate während der Aufnahme wechseln
const encoder = new AudioEncoder({
output: (chunk, meta) => {
// meta.decoderConfig ist nach einer Neukonfiguration wieder gesetzt
if (meta?.decoderConfig) console.log('Neue Decoder-Konfiguration erhalten');
},
error: console.error
});
const baseConfig = { codec: 'opus', sampleRate: 48000, numberOfChannels: 2 };
encoder.configure({ ...baseConfig, bitrate: 128000 });
// Netzwerk wird langsamer: Qualität reduzieren
const switchBitrate = async (bitrate) => {
await encoder.flush(); // bisherige Frames sauber fertig kodieren
encoder.reset(); // Konfiguration verwerfen
encoder.configure({ ...baseConfig, bitrate });
console.log('Bitrate jetzt', bitrate);
};
await switchBitrate(48000);
Aufnahme abbrechen – ausstehendes flush() wird abgelehnt
const encoder = new AudioEncoder({
output: () => {},
error: console.error
});
encoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 1 });
// Einige Frames Stille einreihen
for (let i = 0; i < 50; i++) {
const data = new AudioData({
format: 'f32-planar',
sampleRate: 48000,
numberOfFrames: 960,
numberOfChannels: 1,
timestamp: i * 20000, // Mikrosekunden
data: new Float32Array(960)
});
encoder.encode(data);
data.close();
}
const pending = encoder.flush();
encoder.reset(); // Nutzer klickt auf „Abbrechen“
try {
await pending;
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- InvalidStateError: Wurde der Encoder schon mit
close()geschlossen (state === "closed"), wirftreset()eineDOMExceptionvom TypInvalidStateError. Nach einem Encoder-Fehler ist der Encoder ebenfalls geschlossen. Dann hilft nur eine neue Instanz. - Neu konfigurieren: Nach
reset()wirft jeder Aufruf vonencode()einenInvalidStateError, bisconfigure()erneut aufgerufen wurde. - Datenverlust:
reset()verwirft Frames, die noch in der Warteschlange stehen. Sollen alle Daten erhalten bleiben, zuerstawait encoder.flush()und erst danachreset()aufrufen. - Offene Promises: Ausstehende
flush()-Promises werden mitAbortErrorabgelehnt. Fängt man das nicht ab, entsteht eine unbehandelte Promise-Ablehnung (unhandled rejection). - Kompatibilität: Die WebCodecs-API gibt es nur in sicheren Kontexten (HTTPS), dafür auch in Web Workern. Chromium-Browser unterstützen
AudioEncoderseit Version 94, Firefox seit Version 130 (Desktop). In Safari ist die Unterstützung eingeschränkt. Vor der Nutzung mit'AudioEncoder' in globalThisprüfen.