Start · Sprachen · JavaScript · Referenz · HTMLMediaElement.srcObject

HTMLMediaElement.srcObject

Eigenschaft

Setzt oder liefert das Objekt (z. B. <code>MediaStream</code>, <code>MediaSource</code>, <code>Blob</code>), das einem Audio- oder Video-Element als Medienquelle dient, oder <code>null</code>.

seit JavaScript Baseline: alle modernen Browser (MediaStream); Med Kategorie: webapi

Signatur

HTMLMediaElement.srcObject

Beschreibung

Die Eigenschaft srcObject verbindet ein <video>- oder <audio>-Element direkt mit einem Quellobjekt, ohne dafür eine URL zu brauchen. Laut Spezifikation sind MediaStream, MediaSource, Blob und File erlaubt. In der Praxis wird sie vor allem für Live-Streams genutzt, etwa das Kamerabild aus navigator.mediaDevices.getUserMedia(), eine Bildschirmfreigabe über getDisplayMedia() oder entfernte WebRTC-Streams.

Früher musste man mit URL.createObjectURL(stream) eine Blob-URL erzeugen und in src eintragen. Für MediaStream wird das nicht mehr unterstützt und ist aus den Browsern entfernt. srcObject ist hier der richtige Weg: Es kommt ohne URL-Verwaltung aus, und man muss auch nicht mit revokeObjectURL() aufräumen.

Ist srcObject gesetzt, hat es Vorrang vor dem Attribut src und vor <source>-Kindelementen. Setzt man den Wert auf null, wird die Quelle entfernt und das Element lädt neu (Media-Element-Load-Algorithmus). Das Setzen startet die Wiedergabe nicht von selbst. Dafür braucht es autoplay oder einen Aufruf von play().

Parameter

Name Typ Default Beschreibung
$wert MediaStream | MediaSource | Blob | File | null null Beim Setzen: das Objekt, das als Medienquelle dient. Mit null wird die Zuordnung aufgehoben.

Rückgabewert

Typ
MediaStream | MediaSource | Blob | File | null
Beschreibung
Das aktuell zugewiesene Quellobjekt oder null, wenn keins gesetzt ist.

Beispiele

Webcam-Vorschau mit getUserMedia

const video = document.querySelector('#vorschau');

const starteKamera = async () => {
  try {
    const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: false });
    video.srcObject = stream;
    video.muted = true; // stumm, damit Autoplay-Richtlinien nicht greifen
    await video.play();
    console.log('Kamera läuft:', video.srcObject.id);
  } catch (err) {
    console.error('Kein Kamerazugriff:', err.name);
  }
};

starteKamera();
Kamera läuft: 3f2a9c1e-...

Stream sauber beenden und Quelle entfernen

const stoppeKamera = (video) => {
  const stream = video.srcObject;
  if (stream instanceof MediaStream) {
    // Tracks stoppen, damit die Kamera-LED ausgeht
    stream.getTracks().forEach((track) => track.stop());
  }
  video.srcObject = null;
  console.log('Quelle entfernt:', video.srcObject);
};

stoppeKamera(document.querySelector('#vorschau'));
Quelle entfernt: null

Entfernten WebRTC-Stream anzeigen

const pc = new RTCPeerConnection();
const remoteVideo = document.querySelector('#gegenueber');

pc.addEventListener('track', (event) => {
  const [remoteStream] = event.streams;
  // Nur neu zuweisen, wenn sich der Stream geändert hat
  if (remoteVideo.srcObject !== remoteStream) {
    remoteVideo.srcObject = remoteStream;
    console.log('Remote-Stream verbunden');
  }
});
Remote-Stream verbunden

Lokale Datei ohne Objekt-URL abspielen (mit Fallback)

const input = document.querySelector('input[type=file]');
const player = document.querySelector('audio');

input.addEventListener('change', () => {
  const datei = input.files[0];
  if (!datei) return;
  try {
    player.srcObject = datei; // nicht überall unterstützt
  } catch {
    // Fallback für Browser ohne Blob-Unterstützung in srcObject
    player.src = URL.createObjectURL(datei);
  }
  player.play();
});

// Wichtig · Fallstricke

  • Veraltetes Muster: video.src = URL.createObjectURL(stream) funktioniert mit MediaStream in aktuellen Browsern nicht mehr. Verwende stattdessen srcObject.
  • Browser-Unterstützung: MediaStream wird von allen modernen Browsern unterstützt. Blob/File und MediaSource in srcObject funktionieren nur teilweise, vor allem Chromium unterstützt sie nur eingeschränkt. Bei diesen Typen solltest du eine Funktionsprüfung mit Fallback auf URL.createObjectURL() und src einbauen.
  • Ressourcen freigeben: Wenn du srcObject = null setzt, laufen die Tracks weiter. Kamera und Mikrofon bleiben aktiv, bis du track.stop() aufrufst.
  • Autoplay: Browser blockieren oft Wiedergabe mit Ton, wenn der Nutzer vorher nicht mit der Seite interagiert hat. Stumme Videos (muted) mit playsinline, das auf iOS Safari wichtig ist, starten zuverlässiger. play() gibt ein Promise zurück, das abgelehnt werden kann.
  • Vorrang: Solange srcObject gesetzt ist, werden src und <source> ignoriert.
  • getUserMedia() braucht einen sicheren Kontext (HTTPS oder localhost).