Signatur
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
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');
}
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
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
// 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 einemTypeError. Deshalb vorher die Unterstützung prüfen oder direktremoveTrack()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 aufrecvonlybzw.inactive, undsender.trackist dannnull.