Start · Sprachen · JavaScript · Referenz · RTCTrackEvent.transceiver

RTCTrackEvent.transceiver

Eigenschaft

Schreibgeschützte Eigenschaft, die den <code>RTCRtpTransceiver</code> liefert, zu dem der empfangene Track des <code>track</code>-Ereignisses gehört.

seit JavaScript Baseline: alle modernen Browser (seit 2020) Kategorie: webapi

Signatur

RTCTrackEvent.transceiver

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

Typ
RTCRtpTransceiver
Beschreibung
Der Transceiver, der zum empfangenen Track gehört. Es gilt immer 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);
});
Art: video MID: 0 Richtung: recvonly Gleicher Receiver: true

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);
});
Richtung jetzt: sendrecv

// 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() oder stop().
  • mid kann null sein: Solange die Aushandlung nicht abgeschlossen ist, hat der Transceiver unter Umständen noch keine mid. Das track-Ereignis wird zwar erst beim Setzen der Remote-Beschreibung ausgelöst. Prüfe den Wert trotzdem, bevor du dich darauf verlässt.
  • Änderungen an direction werden erst durch eine neue Aushandlung (Offer/Answer) wirksam. Löse sie über negotiationneeded aus.
  • 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.streams kann leer sein, wenn die Gegenseite den Track ohne Stream hinzugefügt hat. Die Zuordnung über transceiver.mid ist in diesem Fall die robustere Wahl.