Signatur
Beschreibung
Die Eigenschaft state eines MediaRecorder-Objekts zeigt, in welchem Zustand die Aufnahme gerade ist. Möglich sind genau drei Werte:
"inactive": Es läuft keine Aufnahme. Das gilt direkt nach dem Erzeugen und nachstop()."recording": Die Aufnahme läuft, nachdemstart()oderresume()aufgerufen wurde."paused": Die Aufnahme wurde mitpause()angehalten und kann mitresume()fortgesetzt werden.
In der Praxis prüft man state vor dem Aufruf von start(), pause(), resume() oder stop(). Ein Aufruf im falschen Zustand wirft nämlich eine InvalidStateError-DOMException, zum Beispiel start(), wenn schon aufgenommen wird. Mit state lässt sich außerdem die Oberfläche passend halten, etwa Beschriftungen von Schaltflächen oder ein Aufnahme-Symbol.
Die Eigenschaft ist nur lesbar. Den Zustand ändert man ausschließlich über die Methoden des Recorders. Jeder Zustandswechsel löst ein passendes Ereignis aus (start, pause, resume, stop). Auf diese Ereignisse kann man reagieren, statt state regelmäßig abzufragen.
Rückgabewert
"inactive", "recording" oder "paused".Beispiele
Zustand im Lebenszyklus einer Aufnahme verfolgen
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
console.log(recorder.state); // direkt nach dem Erzeugen
recorder.start();
console.log(recorder.state);
recorder.pause();
console.log(recorder.state);
recorder.resume();
recorder.stop();
console.log(recorder.state);
Umschalt-Schaltfläche für Aufnahme starten/stoppen
const button = document.querySelector('#record');
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.addEventListener('dataavailable', (e) => chunks.push(e.data));
recorder.addEventListener('stop', () => {
const blob = new Blob(chunks, { type: recorder.mimeType });
console.log('Aufnahme fertig:', blob.size, 'Bytes');
chunks.length = 0;
});
button.addEventListener('click', () => {
if (recorder.state === 'inactive') {
recorder.start();
button.textContent = 'Stopp';
} else {
recorder.stop();
button.textContent = 'Aufnehmen';
}
});
Pause/Fortsetzen ohne InvalidStateError
const togglePause = (recorder) => {
switch (recorder.state) {
case 'recording':
recorder.pause();
break;
case 'paused':
recorder.resume();
break;
default:
console.warn('Keine laufende Aufnahme – Pause nicht möglich.');
}
return recorder.state;
};
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
console.log(togglePause(recorder));
recorder.start();
console.log(togglePause(recorder));
console.log(togglePause(recorder));
UI über Ereignisse statt Abfragen aktualisieren
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
const statusEl = document.querySelector('#status');
const updateStatus = () => {
statusEl.textContent = `Status: ${recorder.state}`;
};
['start', 'pause', 'resume', 'stop'].forEach((type) =>
recorder.addEventListener(type, updateStatus)
);
updateStatus();
recorder.start();
// Wichtig · Fallstricke
- InvalidStateError:
start()wirft diesen Fehler, wennstatenicht"inactive"ist.pause(),resume()undstop()werfen ihn dagegen nur im Zustand"inactive". Deshalb vor jedem Aufrufstateprüfen. - Zeitpunkt des Wechsels:
stateändert sich sofort beim Methodenaufruf (synchron). Die zugehörigen Ereignisse wiestopoder das letztedataavailablekommen dagegen erst später (asynchron). Nachstop()iststatealso schon"inactive", obwohl die letzten Daten noch fehlen. Den fertigenBlobdaher erst imstop-Ereignis zusammenbauen. - Automatisches Stoppen: Wenn alle Spuren des Streams enden, zum Beispiel weil der Nutzer die Bildschirmfreigabe beendet oder
track.stop()aufgerufen wird, wechselt der Recorder von selbst zu"inactive". Bei einem Fehler löst er außerdem einerror-Ereignis aus. - Kompatibilität: Unterstützt von Chrome 49+, Firefox 25+, Edge 79+ und Safari 14.1+. Nur in sicheren Kontexten (HTTPS) nutzbar, da
getUserMediadort benötigt wird. Ob der Recorder überhaupt verfügbar ist, lässt sich mit'MediaRecorder' in windowprüfen. - Der Wert ist ein einfacher String und kein Enum-Objekt. Vergleiche daher mit
===gegen den exakten, kleingeschriebenen Wert.