Signatur
Beschreibung
Das Ereignis start der Schnittstelle MediaRecorder wird ausgelöst, nachdem MediaRecorder.start() aufgerufen wurde und der Rekorder mit der Aufnahme des Medienstroms beginnt. Dann hat state bereits den Wert "recording".
Sie können das Ereignis per addEventListener("start", handler) oder über die Eigenschaft onstart abonnieren. Übergeben wird ein einfaches Event-Objekt ohne zusätzliche Eigenschaften. Es lässt sich nicht abbrechen und steigt nicht im DOM auf.
Typische Einsätze: die Oberfläche auf den Aufnahmemodus umstellen (Aufnahme-Anzeige, Stopp-Schaltfläche aktivieren), einen Timer für die Aufnahmedauer starten oder Datenpuffer zurücksetzen. Weil das Ereignis asynchron eintrifft, beginnt die Aufnahme verlässlich erst hier und nicht schon direkt nach dem Aufruf von start().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname, immer "start". |
|
| $handler Pflicht | (event: Event) => void | Callback, das ein einfaches Event erhält. event.target verweist auf den auslösenden MediaRecorder. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie { once: true } oder { signal }. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein Event-Objekt.Beispiele
Aufnahme-Anzeige mit addEventListener einschalten
const startAufnahme = async () => {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.addEventListener('start', (event) => {
console.log('Aufnahme läuft, Status:', event.target.state);
document.body.classList.add('is-recording');
});
recorder.addEventListener('dataavailable', (e) => chunks.push(e.data));
recorder.start(1000); // alle 1000 ms ein Datenblock
return recorder;
};
startAufnahme();
onstart-Eigenschaft mit Aufnahmedauer-Timer
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });
let timerId;
let sekunden = 0;
recorder.onstart = () => {
sekunden = 0;
timerId = setInterval(() => {
sekunden += 1;
console.log(`Aufnahmedauer: ${sekunden}s`);
}, 1000);
};
recorder.onstop = () => {
clearInterval(timerId);
stream.getTracks().forEach((t) => t.stop());
};
recorder.start();
setTimeout(() => recorder.stop(), 3000);
Listener wieder entfernen mit removeEventListener
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
const onStart = () => {
console.log('Erste Aufnahme gestartet');
recorder.removeEventListener('start', onStart);
};
recorder.addEventListener('start', onStart);
recorder.start();
setTimeout(() => {
recorder.stop();
recorder.start(); // löst start aus, Handler ist aber entfernt
}, 1000);
// Wichtig · Fallstricke
- Das Ereignis kommt asynchron. Code direkt nach
recorder.start()läuft vor dem Handler. Starten Sie Timer oder UI-Wechsel deshalb im Handler. start()wirft einenInvalidStateError, wennstatenicht"inactive"ist. Dann wird keinstart-Ereignis ausgelöst. Nach dem Fortsetzen mitresume()kommtresume, nichtstart.- Bei inaktivem Stream oder nicht unterstütztem MIME-Typ kann statt
starteinerror-Ereignis kommen. Prüfen Sie den MIME-Typ vorher mitMediaRecorder.isTypeSupported(). getUserMedia()funktioniert nur in einem sicheren Kontext (HTTPS oder localhost) und braucht die Erlaubnis des Nutzers.- Kompatibilität: Chrome, Edge und Firefox seit Langem, Safari erst ab 14.1. Unterstützte Container unterscheiden sich: Safari bevorzugt
video/mp4, Chrome und Firefoxvideo/webm.