Start · Sprachen · JavaScript · Referenz · RTCRtpSender.track

RTCRtpSender.track

Eigenschaft

Die schreibgeschützte Eigenschaft <code>track</code> liefert das <code>MediaStreamTrack</code>, das der <code>RTCRtpSender</code> gerade codiert und sendet, oder <code>null</code>.

seit JavaScript Baseline: alle modernen Browser (seit ca. 2017/201 Kategorie: webapi

Signatur

RTCRtpSender.track

Beschreibung

Jeder RTCRtpSender einer RTCPeerConnection ist für genau eine ausgehende Medienspur zuständig. Über sender.track bekommst du das MediaStreamTrack, das der Sender gerade codiert und an die Gegenstelle überträgt. Den Sender erhältst du zum Beispiel von pc.addTrack(), pc.getSenders() oder transceiver.sender.

Die Eigenschaft ist schreibgeschützt. Um die gesendete Spur auszutauschen, etwa beim Wechsel von Kamera auf Bildschirmfreigabe, rufst du sender.replaceTrack(neueSpur) auf. Das geht ohne neue Aushandlung (Renegotiation), danach zeigt track auf die neue Spur.

Ist der Wert null, sendet der Sender gerade nichts. Das passiert zum Beispiel nach pc.removeTrack(sender), nach replaceTrack(null) oder bei einem Transceiver, den du mit addTransceiver('video') ohne Spur angelegt hast. Häufige Anwendungen: den Video-Sender über track.kind finden, Spuren stummschalten (track.enabled = false) und beim Aufräumen alle lokalen Spuren stoppen.

Rückgabewert

Typ
MediaStreamTrack | null
Beschreibung
Die Spur, die der Sender gerade überträgt, oder null, wenn ihm keine Spur zugeordnet ist.

Beispiele

Sender anlegen und Spur auslesen

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

for (const track of stream.getTracks()) {
  const sender = pc.addTrack(track, stream);
  console.log(sender.track.kind, sender.track === track);
}
audio true video true

Kamera durch Bildschirmfreigabe ersetzen

const switchToScreen = async (pc) => {
  const screen = await navigator.mediaDevices.getDisplayMedia({ video: true });
  const screenTrack = screen.getVideoTracks()[0];

  // Video-Sender über track.kind finden
  const sender = pc.getSenders().find((s) => s.track?.kind === 'video');
  if (!sender) return;

  const oldTrack = sender.track;
  await sender.replaceTrack(screenTrack); // track ist schreibgeschützt
  oldTrack.stop();
  console.log(sender.track.label);
};
screen:0:0 (je nach Browser unterschiedlich)

Mikrofon stummschalten und beim Auflegen aufräumen

const toggleMute = (pc) => {
  const audioSender = pc.getSenders().find((s) => s.track?.kind === 'audio');
  if (audioSender) {
    audioSender.track.enabled = !audioSender.track.enabled;
    console.log('Mikrofon aktiv:', audioSender.track.enabled);
  }
};

const hangUp = (pc) => {
  pc.getSenders().forEach((s) => s.track?.stop());
  pc.close();
};
Mikrofon aktiv: false

// Wichtig · Fallstricke

  • Kann null sein: Prüfe den Wert immer vor dem Zugriff, am einfachsten mit optionaler Verkettung: s.track?.kind. Nach removeTrack() bleibt der Sender in getSenders() erhalten, aber track ist dann null.
  • Nicht direkt zuweisbar: sender.track = x hat keine Wirkung und löst im strikten Modus einen TypeError aus. Nutze dafür replaceTrack().
  • enabled oder stop(): Mit track.enabled = false wird Stille bzw. ein schwarzes Bild gesendet, und die Verbindung bleibt bestehen. track.stop() beendet die Spur endgültig und gibt Kamera bzw. Mikrofon frei. Die Kamera-Kontrollleuchte geht nur mit stop() aus.
  • Browser-Unterstützung: In Chrome, Firefox, Safari und Edge seit Langem verfügbar. Nur sehr alte Implementierungen, die noch addStream() statt addTrack() nutzen, kennen RTCRtpSender nicht.