Start · Sprachen · JavaScript · Referenz · RTCRtpTransceiver.receiver

RTCRtpTransceiver.receiver

Eigenschaft

Schreibgeschützte Eigenschaft, die den <code>RTCRtpReceiver</code> liefert, der eingehende Mediadaten des Transceivers empfängt und dekodiert.

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

Signatur

RTCRtpTransceiver.receiver

Beschreibung

Jeder RTCRtpTransceiver bündelt genau einen RTCRtpSender und einen RTCRtpReceiver, die sich eine gemeinsame mid (Media-ID) im SDP teilen. Die Eigenschaft receiver gibt die empfangende Hälfte dieses Paares zurück. Über sie kommt man an den eingehenden MediaStreamTrack (receiver.track), an Empfangsstatistiken (getStats()), an Informationen über die Quellen (getSynchronizationSources(), getContributingSources()) und an die ausgehandelten Parameter (getParameters()).

Der Empfänger existiert ab der Erzeugung des Transceivers, also schon bevor Medien eintreffen. Sein track ist deshalb von Anfang an vorhanden, liefert aber erst Daten, wenn die Gegenseite tatsächlich sendet und die Richtung (direction) des Transceivers Empfang erlaubt ("sendrecv" oder "recvonly").

Typische Einsatzfälle sind das Anzeigen entfernter Video- und Audiospuren im track-Ereignis, das Überwachen der Empfangsqualität (Paketverlust, Jitter), das Ermitteln der Lautstärke einzelner Quellen sowie das Einstellen von jitterBufferTarget zur Latenzsteuerung.

Die Eigenschaft ist schreibgeschützt und gibt über die gesamte Lebensdauer des Transceivers immer dasselbe RTCRtpReceiver-Objekt zurück.

Rückgabewert

Typ
RTCRtpReceiver
Beschreibung
Das RTCRtpReceiver-Objekt, das für Empfang und Dekodierung der eingehenden Medien dieses Transceivers zuständig ist. Niemals null.

Beispiele

Entfernte Spur im track-Ereignis anzeigen

const pc = new RTCPeerConnection();
const remoteVideo = document.querySelector('#remote');

pc.addEventListener('track', (event) => {
  // event.transceiver.receiver ist identisch mit event.receiver
  const { receiver } = event.transceiver;
  console.log('Empfangene Spur:', receiver.track.kind);

  if (!remoteVideo.srcObject) {
    remoteVideo.srcObject = new MediaStream();
  }
  remoteVideo.srcObject.addTrack(receiver.track);
});
Empfangene Spur: video

Empfangsstatistiken aller Transceiver auswerten

const logInboundStats = async (pc) => {
  for (const transceiver of pc.getTransceivers()) {
    const report = await transceiver.receiver.getStats();
    report.forEach((stat) => {
      if (stat.type === 'inbound-rtp') {
        console.log(
          `${stat.kind} (mid ${transceiver.mid}): ` +
          `${stat.packetsReceived} Pakete, ${stat.packetsLost} verloren, Jitter ${stat.jitter}s`
        );
      }
    });
  }
};

setInterval(() => logInboundStats(pc), 5000);
audio (mid 0): 1520 Pakete, 3 verloren, Jitter 0.004s video (mid 1): 8410 Pakete, 12 verloren, Jitter 0.011s

Nur-Empfangs-Transceiver anlegen und Audiopegel messen

const pc = new RTCPeerConnection();
const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' });

// Track existiert bereits, liefert aber erst nach Verhandlung Daten
console.log(transceiver.receiver.track.readyState);

setInterval(() => {
  const sources = transceiver.receiver.getSynchronizationSources();
  sources.forEach(({ source, audioLevel }) => {
    console.log(`SSRC ${source}: Pegel ${audioLevel?.toFixed(2)}`);
  });
}, 1000);
live SSRC 123456789: Pegel 0.37

// Wichtig · Fallstricke

  • Track ist sofort vorhanden: receiver.track existiert direkt nach addTransceiver() bzw. setRemoteDescription(), ist aber stumm (muted === true), bis tatsächlich RTP-Pakete eintreffen. Auf das unmute-Ereignis des Tracks warten, statt ein Bild sofort zu erwarten.
  • Richtung beachten: Steht direction auf "sendonly" oder "inactive", gibt es den Empfänger zwar weiterhin, er empfängt aber keine Medien.
  • Gestoppte Transceiver: Nach transceiver.stop() wechselt der Track des Empfängers in den Zustand "ended"; das Objekt bleibt aber abrufbar.
  • Kompatibilität: In allen modernen Browsern verfügbar. Einige Empfängermethoden wie jitterBufferTarget oder Encoded Transforms (receiver.transform) werden nicht überall unterstützt – vorher per Feature-Erkennung prüfen. Ältere Safari-Versionen vor 12.1 unterstützen das Transceiver-Modell (Unified Plan) nur eingeschränkt.