Signatur
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
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);
});
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);
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);
// Wichtig · Fallstricke
- Track ist sofort vorhanden:
receiver.trackexistiert direkt nachaddTransceiver()bzw.setRemoteDescription(), ist aber stumm (muted === true), bis tatsächlich RTP-Pakete eintreffen. Auf dasunmute-Ereignis des Tracks warten, statt ein Bild sofort zu erwarten. - Richtung beachten: Steht
directionauf"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
jitterBufferTargetoder 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.