Signatur
Beschreibung
Mit stop() beendest du einen Transceiver einer RTCPeerConnection endgültig. Der Sender schickt danach keine Medien mehr, der Receiver nimmt nichts mehr an. Der Track des Receivers (receiver.track) wird beendet und löst das Ereignis ended aus. Die Eigenschaft currentDirection steht nach der nächsten Aushandlung auf "stopped".
Der Aufruf setzt direction sofort auf "stopped" und löst das Ereignis negotiationneeded aus. Beim nächsten Offer/Answer-Durchlauf wird die zugehörige m-Zeile im SDP mit Port 0 markiert, also abgelehnt. Die Gegenseite erfährt davon erst durch diese Neuverhandlung.
Setze stop() ein, wenn du einen Medienkanal endgültig nicht mehr brauchst, zum Beispiel wenn ein Teilnehmer die Bildschirmfreigabe beendet oder eine Konferenz einen Stream dauerhaft entfernt. Willst du Medien nur vorübergehend anhalten, sind transceiver.direction = "inactive" oder sender.replaceTrack(null) meist besser, denn ein gestoppter Transceiver lässt sich nicht wieder aktivieren.
Rückgabewert
undefined).Beispiele
Bildschirmfreigabe dauerhaft beenden und neu aushandeln
const pc = new RTCPeerConnection();
const screen = await navigator.mediaDevices.getDisplayMedia({ video: true });
const screenTransceiver = pc.addTransceiver(screen.getVideoTracks()[0], {
direction: 'sendonly'
});
// Aushandeln, sobald nötig (auch nach stop())
pc.addEventListener('negotiationneeded', async () => {
await pc.setLocalDescription();
// pc.localDescription über den eigenen Signalisierungskanal senden
console.log('Neues Offer erzeugt:', pc.localDescription.type);
});
// Später: Freigabe beenden
const stopSharing = () => {
screen.getTracks().forEach((t) => t.stop()); // lokale Aufnahme beenden
screenTransceiver.stop(); // Transceiver dauerhaft stoppen
console.log(screenTransceiver.direction);
};
stopSharing();
Alle Video-Transceiver einer Verbindung stoppen
const stopAllVideo = (pc) => {
pc.getTransceivers()
.filter((t) => t.receiver.track.kind === 'video' && t.currentDirection !== 'stopped')
.forEach((t) => t.stop());
};
const pc = new RTCPeerConnection();
pc.addTransceiver('video');
pc.addTransceiver('audio');
stopAllVideo(pc);
console.log(pc.getTransceivers().map((t) => `${t.receiver.track.kind}: ${t.direction}`));
Auf das Ende des Remote-Tracks reagieren
const pc = new RTCPeerConnection();
pc.addEventListener('track', ({ track, transceiver }) => {
track.addEventListener('ended', () => {
console.log(`Remote-Track ${track.kind} beendet (mid: ${transceiver.mid})`);
});
});
// Lokaler Abbruch: beendet auch receiver.track
const transceiver = pc.addTransceiver('audio');
transceiver.receiver.track.addEventListener('ended', () => {
console.log('Lokaler Receiver-Track beendet');
});
transceiver.stop();
// Wichtig · Fallstricke
- Nicht umkehrbar: Ein gestoppter Transceiver bleibt gestoppt. Wenn du später wieder senden willst, brauchst du einen neuen Transceiver (
addTransceiver()) und eine neue Aushandlung. - Neuverhandlung ist Pflicht:
stop()löstnegotiationneededaus. Ohne einen neuen Offer/Answer-Durchlauf erfährt die Gegenseite nichts davon. - Lokaler Track läuft weiter:
stop()beendet nicht den Track, den du ansender.trackübergeben hast (Kamera, Mikrofon, Bildschirm). Rufe dafür zusätzlichtrack.stop()auf, sonst bleibt zum Beispiel die Kamera-LED an. - Der Aufruf auf einer geschlossenen
RTCPeerConnectionwirft einenInvalidStateError. Ein erneuter Aufruf auf einem schon gestoppten Transceiver bewirkt nichts. - Die veraltete Eigenschaft
stoppedist entfernt worden. Prüfe stattdessencurrentDirection === "stopped"bzw.direction === "stopped". - Kompatibilität: Chrome unterstützt
stop()erst ab Version 88 (davor nur bei Unified Plan und unvollständig). Ältere Safari-Versionen zeigen teilweise abweichendes Verhalten beim Wiederverwenden von m-Zeilen.