Signatur
Beschreibung
Die schreibgeschützte Eigenschaft roundTripTimeMeasurements eines RTCRemoteOutboundRtpStreamStats-Objekts (Statistiktyp "remote-outbound-rtp") enthält die Gesamtzahl der gültigen Messungen der Rundlaufzeit, die bisher für diesen Strom erfasst wurden. Der Strom beschreibt aus lokaler Sicht, was die Gegenseite an uns sendet. Die Daten stammen aus RTCP-Berichten des entfernten Senders.
Weil die Richtung hier umgekehrt ist (der entfernte Peer sendet, wir empfangen), kommt die RTT-Messung nicht aus normalen Receiver Reports. Sie beruht auf RTCP-XR-Blöcken (Receiver Reference Time und DLRR nach RFC 3611). Gibt es keine solchen Berichte, gibt es auch keine gültigen Messungen, und der Zähler bleibt bei 0 oder fehlt ganz.
Seinen eigentlichen Nutzen hat der Wert zusammen mit totalRoundTripTime: Teilt man die aufsummierte RTT durch roundTripTimeMeasurements, erhält man die mittlere Rundlaufzeit über die ganze Sitzung. Vergleicht man zwei Abfragen von getStats() zu verschiedenen Zeitpunkten, ergibt sich die mittlere RTT für genau diesen Zeitraum. roundTripTime liefert dagegen nur die zuletzt gemessene Rundlaufzeit.
Rückgabewert
undefined, wenn der Browser die Eigenschaft nicht unterstützt oder noch keine passenden RTCP-XR-Daten vorliegen.Beispiele
Mittlere Rundlaufzeit über die ganze Sitzung berechnen
// pc ist eine verbundene RTCPeerConnection
const logAverageRtt = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'remote-outbound-rtp') return;
const { kind, roundTripTimeMeasurements: n, totalRoundTripTime } = stats;
if (!n) {
console.log(`${kind}: noch keine gültigen RTT-Messungen`);
return;
}
const avgMs = (totalRoundTripTime / n) * 1000;
console.log(`${kind}: ${n} Messungen, Ø RTT ${avgMs.toFixed(1)} ms`);
});
};
await logAverageRtt(pc);
Mittlere RTT für einen Zeitraum aus zwei Abfragen
const snapshot = async (receiver) => {
const report = await receiver.getStats();
for (const s of report.values()) {
if (s.type === 'remote-outbound-rtp') return s;
}
return null;
};
const receiver = pc.getReceivers().find((r) => r.track.kind === 'video');
let previous = await snapshot(receiver);
setInterval(async () => {
const current = await snapshot(receiver);
if (!current || !previous) return;
const deltaN = (current.roundTripTimeMeasurements ?? 0) - (previous.roundTripTimeMeasurements ?? 0);
const deltaT = (current.totalRoundTripTime ?? 0) - (previous.totalRoundTripTime ?? 0);
if (deltaN > 0) {
console.log(`RTT (letzte 5 s): ${((deltaT / deltaN) * 1000).toFixed(1)} ms`);
} else {
console.log('Keine neuen RTT-Messungen im Zeitraum');
}
previous = current;
}, 5000);
Unterstützung prüfen
const report = await pc.getStats();
const remoteOut = [...report.values()].find((s) => s.type === 'remote-outbound-rtp');
if (!remoteOut) {
console.log('Keine remote-outbound-rtp-Statistik vorhanden');
} else if (!('roundTripTimeMeasurements' in remoteOut)) {
console.log('roundTripTimeMeasurements wird nicht unterstützt');
} else {
console.log('Messungen:', remoteOut.roundTripTimeMeasurements);
}
// Wichtig · Fallstricke
- Abhängig von RTCP XR: Für diesen Strom lässt sich die RTT nur mit RTCP-XR-Blöcken (Receiver Reference Time und DLRR) messen. Wird RTCP XR nicht ausgehandelt, bleibt der Wert
0oder fehlt. Eine fehlende RTT-Messung bedeutet also nicht, dass die Verbindung schlecht ist. - Division durch null vermeiden: Prüfe vor
totalRoundTripTime / roundTripTimeMeasurementsimmer, ob der Zähler größer als0ist. - Browser-Unterstützung: Nicht jeder Browser liefert die Eigenschaft, und die Unterstützung hat sich über die Versionen geändert. Frage sie daher immer defensiv ab (
?? 0oder'roundTripTimeMeasurements' in stats). - Nicht verwechseln mit ähnlichen Werten:
RTCRemoteInboundRtpStreamStatshat eine gleichnamige Eigenschaft. Sie beschreibt aber die RTT des eigenen gesendeten Stroms und beruht auf normalen Receiver Reports. Für die Qualität des eigenen Sendens ist meist diese Statistik die richtige. - Die Statistik wird nur aktualisiert, wenn neue RTCP-Berichte ankommen, typischerweise etwa alle ein bis fünf Sekunden. Häufigeres Abfragen liefert daher keine neuen Messungen.