Signatur
Beschreibung
Die Eigenschaft roundTripTimeMeasurements gehört zu einem Statistikobjekt vom Typ "remote-inbound-rtp", das du über RTCPeerConnection.getStats() oder RTCRtpSender.getStats() erhältst. Sie ist eine positive Ganzzahl und zählt, wie viele gültige Round-Trip-Zeitmessungen seit Beginn der Sitzung für diesen SSRC berechnet wurden. Die Messungen stammen aus RTCP-Empfängerberichten (Receiver Reports) bzw. Sender-Reports der Gegenstelle, die einen gültigen LSR/DLSR-Wert enthalten.
Wirklich nützlich ist der Wert zusammen mit totalRoundTripTime: Teilt man die aufsummierte Round-Trip-Zeit durch die Anzahl der Messungen, erhält man die durchschnittliche RTT über die gesamte Sitzung. Vergleicht man zwei Momentaufnahmen, lässt sich außerdem die mittlere RTT in einem bestimmten Zeitfenster berechnen. Das ist genauer als der Wert roundTripTime allein, der nur die zuletzt gemessene RTT wiedergibt.
Einsetzen kannst du die Eigenschaft für Dashboards zur Verbindungsqualität, für adaptive Bitraten-Logik oder um Latenzprobleme zu erkennen. Beachte: Solange noch kein RTCP-Bericht mit gültigem Zeitstempel angekommen ist, ist der Wert 0 oder die Eigenschaft fehlt ganz.
Rückgabewert
Beispiele
Anzahl der RTT-Messungen auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logRttMeasurements = async (pc) => {
const stats = await pc.getStats();
stats.forEach((report) => {
if (report.type === 'remote-inbound-rtp') {
console.log(`${report.kind}: ${report.roundTripTimeMeasurements ?? 0} Messungen`);
}
});
};
await logRttMeasurements(pc);
Durchschnittliche RTT über die gesamte Sitzung
const averageRtt = async (sender) => {
const stats = await sender.getStats();
for (const report of stats.values()) {
if (report.type !== 'remote-inbound-rtp') continue;
const { totalRoundTripTime = 0, roundTripTimeMeasurements = 0 } = report;
if (roundTripTimeMeasurements === 0) return null; // noch keine Daten
return (totalRoundTripTime / roundTripTimeMeasurements) * 1000; // in ms
}
return null;
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const avg = await averageRtt(videoSender);
console.log(avg !== null ? `Mittlere RTT: ${avg.toFixed(1)} ms` : 'Noch keine RTT-Messung');
Mittlere RTT im Zeitfenster (Delta zweier Momentaufnahmen)
let previous = null;
const monitorRtt = async (pc) => {
const stats = await pc.getStats();
for (const report of stats.values()) {
if (report.type !== 'remote-inbound-rtp' || report.kind !== 'video') continue;
if (previous) {
const deltaCount = report.roundTripTimeMeasurements - previous.roundTripTimeMeasurements;
const deltaTime = report.totalRoundTripTime - previous.totalRoundTripTime;
if (deltaCount > 0) {
console.log(`RTT (letzte 5 s): ${((deltaTime / deltaCount) * 1000).toFixed(1)} ms`);
}
}
previous = report;
}
};
const timer = setInterval(() => monitorRtt(pc), 5000);
// Später: clearInterval(timer);
// Wichtig · Fallstricke
- Division durch null: Direkt nach dem Verbindungsaufbau ist der Wert
0oderundefined. Prüfe das immer, bevor dutotalRoundTripTimedadurch teilst. - Der Zähler steigt nur, wenn ein RTCP-Bericht eine gültige RTT-Berechnung erlaubt. Kommen Berichte ohne LSR-Wert an (die Gegenstelle hat noch keinen Sender-Report erhalten), werden sie nicht mitgezählt.
- Einheit: Die Eigenschaft ist ein reiner Zähler.
totalRoundTripTimeundroundTripTimewerden dagegen in Sekunden angegeben, nicht in Millisekunden. - Browser-Kompatibilität: wird von aktuellen Chromium-Browsern, Firefox und Safari unterstützt, ältere Versionen liefern die Eigenschaft aber nicht. Nutze deshalb Fallbacks wie
?? 0. - Pro SSRC (und damit pro Track bzw. Simulcast-Ebene) gibt es ein eigenes Statistikobjekt. Bei Simulcast musst du die Werte also pro Ebene getrennt auswerten.