Signatur
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
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);
}
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);
};
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();
};
// Wichtig · Fallstricke
- Kann
nullsein: Prüfe den Wert immer vor dem Zugriff, am einfachsten mit optionaler Verkettung:s.track?.kind. NachremoveTrack()bleibt der Sender ingetSenders()erhalten, abertrackist dannnull. - Nicht direkt zuweisbar:
sender.track = xhat keine Wirkung und löst im strikten Modus einenTypeErroraus. Nutze dafürreplaceTrack(). enabledoderstop(): Mittrack.enabled = falsewird 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 mitstop()aus.- Browser-Unterstützung: In Chrome, Firefox, Safari und Edge seit Langem verfügbar. Nur sehr alte Implementierungen, die noch
addStream()stattaddTrack()nutzen, kennenRTCRtpSendernicht.