Signatur
Beschreibung
Die Eigenschaft MediaRecorder.stream liefert genau das MediaStream-Objekt, das beim Aufruf von new MediaRecorder(stream, options) übergeben wurde. Es handelt sich um dieselbe Objektreferenz, also um keine Kopie. Die Eigenschaft ist schreibgeschützt: Einem bestehenden Recorder kann man keinen anderen Stream zuweisen.
Das ist vor allem dann nützlich, wenn man nur noch den Recorder in der Hand hat, etwa in einem Event-Handler wie onstop oder in einer Hilfsfunktion, und trotzdem auf die zugrunde liegenden Spuren (MediaStreamTrack) zugreifen will. Typische Aufgaben sind: nach der Aufnahme alle Spuren mit track.stop() beenden, damit Kamera- oder Mikrofonanzeige erlöschen, sich die Einstellungen einer Spur ansehen oder denselben Stream in einem <video>-Element als Vorschau anzeigen.
Ein wichtiger Punkt: Der Recorder zeichnet die Spuren auf, die der Stream beim Start enthält. Fügt man während einer laufenden Aufnahme Spuren über stream.addTrack() hinzu oder entfernt welche, brechen die meisten Browser die Aufnahme mit einem Fehler ab (Ereignis error) oder ignorieren die neuen Spuren.
Rückgabewert
MediaStream-Objekt, das dem Konstruktor übergeben wurde. Es ist identisch mit dem ursprünglichen Objekt (recorder.stream === stream).Beispiele
Stream-Referenz prüfen
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream);
console.log(recorder.stream === stream);
console.log(recorder.stream.getAudioTracks().length);
Kamera und Mikrofon nach der Aufnahme freigeben
const startRecording = async () => {
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.ondataavailable = (e) => chunks.push(e.data);
recorder.onstop = () => {
// Spuren über recorder.stream beenden, damit die Aufnahmeanzeige erlischt
recorder.stream.getTracks().forEach((track) => track.stop());
const blob = new Blob(chunks, { type: recorder.mimeType });
console.log(`Aufnahme fertig: ${blob.size} Bytes`);
};
recorder.start();
setTimeout(() => recorder.stop(), 3000);
};
startRecording();
Live-Vorschau aus dem Recorder-Stream
const showPreview = (recorder, videoEl) => {
videoEl.srcObject = recorder.stream;
videoEl.muted = true; // Rückkopplung vermeiden
return videoEl.play();
};
const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });
await showPreview(recorder, document.querySelector('video'));
recorder.start(1000);
const [track] = recorder.stream.getVideoTracks();
console.log(track.label, track.getSettings().width);
// Wichtig · Fallstricke
- Nur lesbar: Wenn man
recorder.streametwas zuweist, passiert im nicht-strikten Modus einfach nichts, im strikten Modus gibt es einenTypeError. Wer einen anderen Stream aufnehmen will, braucht einen neuenMediaRecorder. - Spuren ändern während der Aufnahme: Wird
addTrack()oderremoveTrack()auf dem Stream aufgerufen, währendstate === 'recording'gilt, bricht die Aufnahme in Chrome und Firefox meist ab. Wer Quellen dynamisch wechseln will, mischt sie vorher, zum Beispiel über ein<canvas>mitcaptureStream()oder einenAudioContext. - Ressourcen:
recorder.stop()beendet nicht die Spuren des Streams. Kamera und Mikrofon bleiben so lange aktiv, bis mantrack.stop()aufruft. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt, in Safari ab 14.1.
getUserMediaundgetDisplayMediafunktionieren nur in sicheren Kontexten (HTTPS oder localhost).