Start · Sprachen · JavaScript · Referenz · RTCPeerConnection.removeStream()

RTCPeerConnection.removeStream()

Methode

Entfernt einen <code>MediaStream</code> als lokale Audio- oder Videoquelle aus einer <code>RTCPeerConnection</code>. Die Methode ist veraltet, stattdessen <code>removeTrack()</code> verwenden.

seit JavaScript Veraltet – aus der Spezifikation entfernt; in mode deprecated seit ja Kategorie: webapi

Signatur

RTCPeerConnection.prototype.removeStream(mediaStream)

Beschreibung

Die Methode removeStream() nimmt einen zuvor mit addStream() hinzugefügten MediaStream wieder aus einer RTCPeerConnection heraus. Danach sendet die Verbindung die Audio- und Videospuren dieses Streams nicht mehr an die Gegenstelle. Weil sich dabei die Menge der gesendeten Medien ändert, löst die Verbindung anschließend ein negotiationneeded-Ereignis aus. Die Sitzung muss also per Offer/Answer neu ausgehandelt werden.

Die Methode stammt aus der frühen, stream-basierten WebRTC-API. Die aktuelle Spezifikation arbeitet mit einzelnen Spuren: Man fügt Tracks mit addTrack() hinzu, bekommt dafür je einen RTCRtpSender zurück und entfernt die Spur wieder mit removeTrack(sender). Mit RTCRtpSender.replaceTrack() lässt sich eine Spur sogar ohne neue Aushandlung austauschen, zum Beispiel beim Kamerawechsel.

Man trifft removeStream() heute nur noch in altem Code oder in älteren Polyfills (etwa frühen Versionen von adapter.js). In neuem Code sollte man die Methode nicht mehr einsetzen. Bestehenden Code migriert man, indem man für jede Spur des Streams den passenden Sender sucht und removeTrack() aufruft.

Parameter

Name Typ Default Beschreibung
$mediaStream Pflicht MediaStream Der MediaStream, der zuvor mit addStream() hinzugefügt wurde und nicht mehr gesendet werden soll.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Veraltete Nutzung: Stream entfernen (nur Legacy)

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });

// Legacy-API – existiert in modernen Browsern nicht mehr
if (typeof pc.addStream === 'function') {
  pc.addStream(stream);
  // ... später: Kamera/Mikrofon nicht mehr senden
  pc.removeStream(stream);
  console.log('Stream per removeStream() entfernt');
} else {
  console.log('removeStream() wird nicht unterstützt');
}
removeStream() wird nicht unterstützt

Moderner Ersatz: alle Spuren eines Streams mit removeTrack() entfernen

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });

// Spuren hinzufügen
stream.getTracks().forEach((track) => pc.addTrack(track, stream));

// Ersatz für removeStream(stream)
const removeStreamCompat = (peer, mediaStream) => {
  const trackIds = new Set(mediaStream.getTracks().map((t) => t.id));
  peer.getSenders()
    .filter((sender) => sender.track && trackIds.has(sender.track.id))
    .forEach((sender) => peer.removeTrack(sender));
};

removeStreamCompat(pc, stream);
console.log(pc.getSenders().map((s) => s.track)); // null-Einträge
[null, null]

Neu verhandeln nach dem Entfernen

const pc = new RTCPeerConnection();

pc.addEventListener('negotiationneeded', async () => {
  const offer = await pc.createOffer();
  await pc.setLocalDescription(offer);
  // Offer über den eigenen Signalisierungskanal senden
  console.log('Neues Offer erzeugt:', pc.localDescription.type);
});

const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [sender] = stream.getVideoTracks().map((t) => pc.addTrack(t, stream));

// Video-Senden beenden → löst negotiationneeded aus
pc.removeTrack(sender);
stream.getTracks().forEach((t) => t.stop()); // Kamera freigeben
Neues Offer erzeugt: offer

// Wichtig · Fallstricke

  • Veraltet: removeStream() wurde aus der WebRTC-Spezifikation entfernt. Firefox hat die Methode nie unterstützt, Chrome und Safari haben sie entfernt. Ein Aufruf führt in aktuellen Browsern zu einem TypeError. Deshalb vorher die Unterstützung prüfen oder direkt removeTrack() verwenden.
  • Geräte bleiben aktiv: Das Entfernen aus der Verbindung schaltet Kamera und Mikrofon nicht ab. Erst mit track.stop() werden die Geräte freigegeben und die Aufnahme-Anzeige des Browsers erlischt.
  • Neue Aushandlung nötig: Nach dem Entfernen muss ein neues Offer/Answer ausgetauscht werden, sonst merkt die Gegenstelle nichts von der Änderung. Wer nur die Quelle wechseln will, nimmt besser RTCRtpSender.replaceTrack(). Das kommt ohne neue Aushandlung aus.
  • Nach removeTrack() bleibt der Transceiver bestehen. Seine Richtung wechselt auf recvonly bzw. inactive, und sender.track ist dann null.