Start · Sprachen · JavaScript · Referenz · RTCRtpTransceiver.stop()

RTCRtpTransceiver.stop()

Methode

Stoppt einen <code>RTCRtpTransceiver</code> dauerhaft, indem der zugehörige <code>RTCRtpSender</code> und <code>RTCRtpReceiver</code> beendet werden.

seit JavaScript Baseline: alle modernen Browser (Chrome 88+, Firef Kategorie: webapi

Signatur

RTCRtpTransceiver.prototype.stop()

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

Typ
void
Beschreibung
Kein 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();
stopped Neues Offer erzeugt: offer

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}`));
["video: stopped", "audio: sendrecv"]

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();
Lokaler Receiver-Track beendet

// 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öst negotiationneeded aus. Ohne einen neuen Offer/Answer-Durchlauf erfährt die Gegenseite nichts davon.
  • Lokaler Track läuft weiter: stop() beendet nicht den Track, den du an sender.track übergeben hast (Kamera, Mikrofon, Bildschirm). Rufe dafür zusätzlich track.stop() auf, sonst bleibt zum Beispiel die Kamera-LED an.
  • Der Aufruf auf einer geschlossenen RTCPeerConnection wirft einen InvalidStateError. Ein erneuter Aufruf auf einem schon gestoppten Transceiver bewirkt nichts.
  • Die veraltete Eigenschaft stopped ist entfernt worden. Prüfe stattdessen currentDirection === "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.