Signatur
Beschreibung
Die Eigenschaft remoteId eines RTCOutboundRtpStreamStats-Eintrags (Typ "outbound-rtp") ist ein String. Sie verweist auf einen anderen Eintrag im selben RTCStatsReport, nämlich auf das Objekt vom Typ "remote-inbound-rtp". Dieses Objekt beschreibt, wie der RTCRtpReceiver des entfernten Peers die Medien empfängt, die dein lokaler Sender für diese SSRC schickt.
Die Daten auf der Gegenseite stammen aus RTCP-Receiver-Reports. Dazu gehören etwa packetsLost, jitter, fractionLost und roundTripTime. Mit remoteId verbindest du die lokale Sendestatistik (z. B. bytesSent, packetsSent) direkt mit der Rückmeldung der Gegenseite. So kannst du die Verbindungsqualität aus Sicht des Empfängers auswerten, ohne einen eigenen Signalisierungskanal zu brauchen.
Typische Einsatzgebiete sind Dashboards für die Anrufqualität, eine adaptive Bitratensteuerung und das Erkennen von Paketverlusten auf der Senderseite. Den verknüpften Eintrag holst du mit report.get(outbound.remoteId).
Rückgabewert
id des zugehörigen RTCRemoteInboundRtpStreamStats-Eintrags im selben RTCStatsReport. Der Wert ist undefined, solange noch kein RTCP-Receiver-Report vom entfernten Peer eingegangen ist.Beispiele
Remote-Inbound-Statistik zu einem Sender auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logRemoteQuality = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'outbound-rtp') return;
const remote = stats.remoteId ? report.get(stats.remoteId) : undefined;
if (!remote) {
console.log(`${stats.kind}: noch kein RTCP-Report vorhanden`);
return;
}
console.log(`${stats.kind}: verloren=${remote.packetsLost}, RTT=${remote.roundTripTime}s`);
});
};
logRemoteQuality(pc);
Verlustrate aus Sicht des Empfängers berechnen (pro Sender)
const getLossRate = async (sender) => {
// getStats() am RTCRtpSender liefert nur die Statistik dieses Senders
const report = await sender.getStats();
const outbound = [...report.values()].find((s) => s.type === 'outbound-rtp');
const remote = outbound?.remoteId && report.get(outbound.remoteId);
if (!remote) return null;
const total = outbound.packetsSent;
return total > 0 ? remote.packetsLost / total : 0;
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const rate = await getLossRate(videoSender);
console.log(rate === null ? 'Keine Daten' : `Verlust: ${(rate * 100).toFixed(2)} %`);
Bitrate drosseln, wenn die Gegenseite hohen Verlust meldet
const adaptBitrate = async (sender) => {
const report = await sender.getStats();
for (const stats of report.values()) {
if (stats.type !== 'outbound-rtp' || !stats.remoteId) continue;
const remote = report.get(stats.remoteId);
if (remote?.fractionLost > 0.05) {
const params = sender.getParameters();
params.encodings.forEach((enc) => { enc.maxBitrate = 500_000; });
await sender.setParameters(params);
console.log('Bitrate auf 500 kbit/s begrenzt');
}
}
};
setInterval(() => pc.getSenders().forEach(adaptBitrate), 2000);
// Wichtig · Fallstricke
- Nicht sofort verfügbar:
remoteId(und der verknüpfte Eintrag) erscheint erst, wenn der erste RTCP-Receiver-Report angekommen ist. Das dauert in der Regel einige Sekunden. Prüfe deshalb immer aufundefined. - Nur innerhalb eines Reports gültig: Die ID löst du ausschließlich im selben
RTCStatsReportauf. IDs sind zwar meist über mehrere Abfragen stabil, verlasse dich aber nicht auf eine Zuordnung über Reports hinweg. - Nicht mit
RTCInboundRtpStreamStats.remoteIdverwechseln: Beim eingehenden Stream verweistremoteIdauf"remote-outbound-rtp". Hier ist das Gegenstück dagegen"remote-inbound-rtp", und dessenlocalIdzeigt zurück auf den Outbound-Eintrag. - Verzögerte Werte: Die Remote-Werte stammen aus RTCP und sind daher weniger aktuell als die lokalen Zähler. Achte auf
timestamp, wenn du Differenzen berechnest. - Kompatibilität: Wird in aktuellen Versionen von Chrome, Edge, Firefox und Safari unterstützt. Ältere Browser nutzten stattdessen veraltete Statistiktypen (z. B.
ssrcin Chrome) oder boten die Verknüpfung gar nicht an.