Signatur
Beschreibung
Wenn eine RTCPeerConnection einen neuen eingehenden Medien-Track erhält, löst sie das Ereignis track aus. Das zugehörige RTCTrackEvent enthält neben track, receiver und streams auch die Eigenschaft transceiver. Sie verweist auf den RTCRtpTransceiver, der den Track verwaltet.
Ein Transceiver fasst einen RTCRtpSender und einen RTCRtpReceiver zusammen, die sich eine gemeinsame mid (Media-ID aus der SDP) teilen. Über event.transceiver kannst du also direkt auf beide Richtungen desselben Medienkanals zugreifen. Du kannst zum Beispiel die Übertragungsrichtung (direction) ändern, Codec-Präferenzen setzen (setCodecPreferences()) oder über transceiver.sender.replaceTrack() einen eigenen Track auf demselben Kanal zurücksenden.
Das ist vor allem bei der Perfect-Negotiation-Technik und in Anwendungen mit mehreren Video- oder Audiokanälen nützlich. Über transceiver.mid lässt sich ein eingehender Track eindeutig einer Signalisierungs-Information zuordnen, etwa „Kamera“ oder „Bildschirmfreigabe“. Das ist zuverlässiger als die Zuordnung über Stream-IDs.
Rückgabewert
event.transceiver.receiver === event.receiver und event.transceiver.receiver.track === event.track.Beispiele
Transceiver-Daten beim Empfang eines Tracks auslesen
const pc = new RTCPeerConnection();
pc.addEventListener('track', (event) => {
const { transceiver, track } = event;
console.log('Art:', track.kind);
console.log('MID:', transceiver.mid);
console.log('Richtung:', transceiver.direction);
console.log('Gleicher Receiver:', transceiver.receiver === event.receiver);
});
Tracks anhand der MID den richtigen Video-Elementen zuordnen
const pc = new RTCPeerConnection();
// Zuordnung wurde vorher über den Signalisierungskanal ausgetauscht
const midZuordnung = new Map([
['0', document.querySelector('#kamera')],
['1', document.querySelector('#bildschirm')]
]);
pc.ontrack = ({ transceiver, track }) => {
const videoEl = midZuordnung.get(transceiver.mid);
if (videoEl) {
videoEl.srcObject = new MediaStream([track]);
} else {
console.warn('Unbekannte MID:', transceiver.mid);
}
};
Eigenen Track auf demselben Transceiver zurücksenden
const pc = new RTCPeerConnection();
pc.addEventListener('track', async ({ transceiver, track }) => {
if (track.kind !== 'audio') return;
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const [micTrack] = stream.getAudioTracks();
// Kein neuer Transceiver und damit keine neue m-Zeile in der SDP nötig
await transceiver.sender.replaceTrack(micTrack);
transceiver.direction = 'sendrecv';
console.log('Richtung jetzt:', transceiver.direction);
});
// Wichtig · Fallstricke
- Schreibgeschützt: Die Eigenschaft selbst kannst du nicht neu zuweisen. Das zurückgegebene Transceiver-Objekt lässt sich aber verändern, etwa über
direction,setCodecPreferences()oderstop(). midkannnullsein: Solange die Aushandlung nicht abgeschlossen ist, hat der Transceiver unter Umständen noch keinemid. Dastrack-Ereignis wird zwar erst beim Setzen der Remote-Beschreibung ausgelöst. Prüfe den Wert trotzdem, bevor du dich darauf verlässt.- Änderungen an
directionwerden erst durch eine neue Aushandlung (Offer/Answer) wirksam. Löse sie übernegotiationneededaus. - Kompatibilität: In aktuellen Versionen von Chrome, Edge, Firefox und Safari verfügbar. Sehr alte Implementierungen mit „Plan B“-SDP (Chrome vor Version 72) kannten keine Transceiver. Seit „Unified Plan“ ist die Eigenschaft überall verfügbar.
event.streamskann leer sein, wenn die Gegenseite den Track ohne Stream hinzugefügt hat. Die Zuordnung übertransceiver.midist in diesem Fall die robustere Wahl.