Signatur
Beschreibung
Mit pause() unterbrechen Sie eine laufende Aufnahme, die mit MediaRecorder.start() gestartet wurde. Anders als bei stop() wird die Aufnahme dabei nicht abgeschlossen. Der Rekorder nimmt nur vorübergehend keine Daten mehr aus dem MediaStream auf. Wenn Sie danach resume() aufrufen, läuft die Aufnahme nahtlos in derselben Datei weiter. Die pausierte Zeit fehlt einfach in der fertigen Aufnahme.
Beim Aufruf passiert Folgendes:
- Ist
stategleich"inactive", wird einDOMExceptionvom TypInvalidStateErrorausgelöst. - Ist
statebereits"paused", passiert nichts. - Sonst wird
statesofort auf"paused"gesetzt. Der Rekorder hört auf, Mediendaten zu sammeln, und löst asynchron das Ereignispauseaus.
Typische Einsatzfälle sind Sprachmemos, Bildschirmaufnahmen oder Video-Tutorials mit einer Schaltfläche „Pause/Fortsetzen“. Ein weiterer Fall: Die Aufnahme wird automatisch angehalten, wenn der Tab in den Hintergrund wechselt oder das Mikrofon stummgeschaltet wird. Der zugrunde liegende MediaStream läuft dabei weiter, Kamera und Mikrofon bleiben also aktiv.
Rückgabewert
recorder.state ab ("paused"), die Benachrichtigung kommt über das Ereignis pause.Beispiele
Sprachaufnahme mit Pause- und Fortsetzen-Schaltfläche
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.addEventListener('dataavailable', (e) => chunks.push(e.data));
recorder.addEventListener('pause', () => console.log('Aufnahme pausiert'));
recorder.addEventListener('resume', () => console.log('Aufnahme läuft weiter'));
const toggleBtn = document.querySelector('#toggle');
document.querySelector('#start').addEventListener('click', () => recorder.start());
toggleBtn.addEventListener('click', () => {
if (recorder.state === 'recording') {
recorder.pause();
toggleBtn.textContent = 'Fortsetzen';
} else if (recorder.state === 'paused') {
recorder.resume();
toggleBtn.textContent = 'Pause';
}
});
Sicher pausieren – InvalidStateError vermeiden
const safePause = (recorder) => {
if (recorder.state !== 'recording') {
console.warn(`Pause nicht möglich, Zustand: ${recorder.state}`);
return false;
}
recorder.pause();
return true;
};
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
safePause(recorder); // noch nicht gestartet
recorder.start();
console.log(safePause(recorder), recorder.state);
Aufnahme automatisch pausieren, wenn der Tab verborgen wird
const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });
recorder.start(1000); // alle 1000 ms ein Datenblock
document.addEventListener('visibilitychange', () => {
if (document.hidden && recorder.state === 'recording') {
recorder.pause();
} else if (!document.hidden && recorder.state === 'paused') {
recorder.resume();
}
});
recorder.onpause = () => console.log('Pausiert um', new Date().toLocaleTimeString());
// Wichtig · Fallstricke
- InvalidStateError: Wenn Sie
pause()vorstart()oder nachstop()aufrufen, also beistate === "inactive", wird eine Ausnahme ausgelöst. Prüfen Sie deshalb vorherrecorder.state. - Kein Datenblock beim Pausieren:
pause()löst keindataavailableaus. Wenn Sie beim Pausieren die bisherigen Daten brauchen, rufen Sie vorherrequestData()auf. - Stream bleibt aktiv: Kamera und Mikrofon werden nicht freigegeben, die Aufnahmeanzeige des Browsers bleibt also sichtbar. Um die Geräte wirklich freizugeben, beenden Sie die Spuren mit
track.stop(). - Zeitstempel: Pausierte Abschnitte fehlen in der Aufnahme, die Datei wird aber nicht in einzelne Teile aufgespalten. Bei WebM-Dateien fehlen je nach Browser Angaben zur Gesamtdauer. Das liegt nicht an
pause(), sondern am Container-Format. - Ereignis ist asynchron:
stateändert sich sofort, das Ereignispausekommt aber erst in einem späteren Task. - Kompatibilität: Wird von Chrome, Edge, Firefox und Safari (ab 14.1) unterstützt. Welche Formate (
mimeType) funktionieren, ist je nach Browser verschieden. Prüfen Sie das mitMediaRecorder.isTypeSupported().