Signatur
Beschreibung
Die Eigenschaft localId eines RTCRemoteInboundRtpStreamStats-Objekts (Statistiktyp "remote-inbound-rtp") enthält die id des passenden RTCOutboundRtpStreamStats-Eintrags (Typ "outbound-rtp") im selben RTCStatsReport. Die beiden Einträge beschreiben denselben RTP-Datenstrom aus zwei Sichten: Outbound ist das, was Ihr Browser sendet. Remote-Inbound ist das, was die Gegenstelle per RTCP-Receiver-Reports über den Empfang dieses Datenstroms meldet.
Die Verknüpfung geht in beide Richtungen: outbound.remoteId === remoteInbound.id und remoteInbound.localId === outbound.id. So lassen sich lokale Sendewerte (z. B. bytesSent, packetsSent, framesEncoded) mit den Empfangswerten der Gegenseite (z. B. packetsLost, fractionLost, roundTripTime, jitter) zusammenführen.
Typische Einsatzfälle sind Qualitätsanzeigen in Videokonferenz-Anwendungen, adaptive Bitratensteuerung und Telemetrie. Mit localId und RTCStatsReport.get() brauchen Sie den Bericht nicht nach passenden SSRC-Werten zu durchsuchen, sondern springen direkt zum zugehörigen Eintrag.
Rückgabewert
id des zugehörigen RTCOutboundRtpStreamStats-Eintrags im selben RTCStatsReport. Nutzen Sie sie mit report.get(localId).Beispiele
Remote-Inbound- und Outbound-Statistik verknüpfen
// pc ist eine verbundene RTCPeerConnection
const report = await pc.getStats();
report.forEach((stat) => {
if (stat.type !== 'remote-inbound-rtp') return;
// Direkter Sprung zum lokalen Sende-Eintrag
const outbound = report.get(stat.localId);
if (!outbound) return;
console.log(`${stat.kind}: gesendet ${outbound.packetsSent} Pakete, ` +
`Gegenseite meldet ${stat.packetsLost} verloren, ` +
`RTT ${(stat.roundTripTime * 1000).toFixed(0)} ms`);
});
Verlustrate pro gesendetem Datenstrom überwachen
const monitorSendQuality = (pc, intervalMs = 2000) => {
const timer = setInterval(async () => {
const report = await pc.getStats();
for (const stat of report.values()) {
if (stat.type !== 'remote-inbound-rtp') continue;
const outbound = report.get(stat.localId);
if (!outbound) continue;
const lossPercent = (stat.fractionLost ?? 0) * 100;
if (lossPercent > 5) {
console.warn(`Hoher Verlust bei ${outbound.kind} (SSRC ${outbound.ssrc}): ` +
`${lossPercent.toFixed(1)} %`);
}
}
}, intervalMs);
return () => clearInterval(timer); // Aufräumfunktion
};
const stopMonitoring = monitorSendQuality(pc);
// später: stopMonitoring();
Fallback über SSRC, falls localId fehlt
const findOutbound = (report, remoteInbound) => {
// Bevorzugt: direkte Referenz
if (remoteInbound.localId && report.has(remoteInbound.localId)) {
return report.get(remoteInbound.localId);
}
// Fallback für ältere Implementierungen: Zuordnung über SSRC und kind
for (const stat of report.values()) {
if (stat.type === 'outbound-rtp' &&
stat.ssrc === remoteInbound.ssrc &&
stat.kind === remoteInbound.kind) {
return stat;
}
}
return undefined;
};
const report = await pc.getStats();
const remote = [...report.values()].find((s) => s.type === 'remote-inbound-rtp');
console.log(remote ? findOutbound(report, remote)?.id : 'kein Remote-Report');
// Wichtig · Fallstricke
- Erst nach RTCP-Reports vorhanden:
remote-inbound-rtp-Einträge erscheinen erst, wenn die Gegenstelle RTCP-Receiver-Reports geschickt hat. Direkt nach dem Verbindungsaufbau fehlen sie daher oft. - Die IDs haben kein festes Format: Werte wie
"OT01V…"sind browserabhängig. Parsen Sie sie nicht, sondern nutzen Sie sie nur zum Nachschlagen mitreport.get(). - Nur im selben Bericht gültig: Die Referenz gilt innerhalb eines
RTCStatsReport. Prüfen Sie immer mitreport.has()oder optionaler Verkettung (?.), ob der Eintrag existiert, zum Beispiel nachremoveTrack()oder einer Neuverhandlung. - Browser-Kompatibilität: Chromium-Browser und Firefox unterstützen die Eigenschaft. Safari und ältere Versionen setzen sie teils nicht oder unvollständig. Ein Fallback über
ssrcundkindist daher sinnvoll. - Nicht verwechseln: Auch
RTCRemoteOutboundRtpStreamStatshat einlocalId. Dieses verweist aber auf eineninbound-rtp-Eintrag, nicht aufoutbound-rtp. - Leistung: Rufen Sie
getStats()nicht zu häufig auf. Intervalle von etwa 1–5 Sekunden sind üblich.