Signatur
Beschreibung
Die Eigenschaft roundTripTime gehört zu Statistikobjekten vom Typ "remote-inbound-rtp", die RTCPeerConnection.getStats() bzw. RTCRtpSender.getStats() liefern. Sie beschreibt, wie lange ein Paket vom lokalen Sender zur Gegenstelle und zurück braucht. Der Wert ist eine Gleitkommazahl in Sekunden, z. B. 0.045 für 45 ms.
Die RTT wird aus RTCP-Empfängerberichten (Receiver Reports) berechnet, die die Gegenstelle für einen von uns gesendeten Stream zurückschickt. Dafür werden die Felder LSR (Last Sender Report) und DLSR (Delay since Last SR) ausgewertet. Die Eigenschaft enthält immer den zuletzt gemessenen Wert, keinen Durchschnitt.
Einsatzgebiete sind Verbindungsqualitäts-Anzeigen, adaptive Bitraten-Logik, Diagnose-Dashboards und die Erkennung von Netzproblemen während eines Anrufs. Für einen Durchschnitt über die Zeit kombiniert man totalRoundTripTime mit roundTripTimeMeasurements.
Rückgabewert
undefined, solange noch kein RTCP-Empfängerbericht mit gültigen LSR/DLSR-Daten eingetroffen ist.Beispiele
Aktuelle RTT aller gesendeten Streams auslesen
// pc ist eine verbundene RTCPeerConnection
const logRtt = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'remote-inbound-rtp' && stats.roundTripTime !== undefined) {
const ms = (stats.roundTripTime * 1000).toFixed(1);
console.log(`${stats.kind} (SSRC ${stats.ssrc}): RTT ${ms} ms`);
}
});
};
await logRtt(pc);
Verbindungsqualität periodisch anzeigen
const qualityLabel = (rttSeconds) => {
if (rttSeconds < 0.15) return 'gut';
if (rttSeconds < 0.3) return 'mittel';
return 'schlecht';
};
const startMonitor = (sender, intervalMs = 2000) => {
const timer = setInterval(async () => {
const report = await sender.getStats();
for (const stats of report.values()) {
if (stats.type === 'remote-inbound-rtp' && typeof stats.roundTripTime === 'number') {
console.log(`RTT: ${Math.round(stats.roundTripTime * 1000)} ms – Qualität: ${qualityLabel(stats.roundTripTime)}`);
}
}
}, intervalMs);
return () => clearInterval(timer);
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const stopMonitor = startMonitor(videoSender);
Aktuelle RTT mit Durchschnitt vergleichen
const compareRtt = async (pc) => {
const report = await pc.getStats();
for (const s of report.values()) {
if (s.type !== 'remote-inbound-rtp' || !s.roundTripTimeMeasurements) continue;
const avg = s.totalRoundTripTime / s.roundTripTimeMeasurements;
console.log({
aktuellMs: Math.round(s.roundTripTime * 1000),
durchschnittMs: Math.round(avg * 1000),
messungen: s.roundTripTimeMeasurements
});
}
};
await compareRtt(pc);
// Wichtig · Fallstricke
- Einheit: Der Wert steht in Sekunden, nicht in Millisekunden. Für die Anzeige mit 1000 multiplizieren.
- Anfangs nicht vorhanden: Direkt nach dem Verbindungsaufbau fehlt die Eigenschaft oft, weil noch kein RTCP-Empfängerbericht eingetroffen ist. Deshalb immer auf
undefinedprüfen. - Nur für gesendete Streams:
remote-inbound-rtpbeschreibt, wie die Gegenstelle unsere Pakete empfängt. Für empfangene Streams gibt esremote-outbound-rtp. Dort ist die RTT nur verfügbar, wenn RTCP-XR/DLRR unterstützt wird. - Nicht mit ICE-RTT verwechseln:
RTCIceCandidatePairStats.currentRoundTripTimemisst die RTT über STUN-Anfragen auf Transportebene und kann leicht abweichen. - Kompatibilität: Ältere Browser (insbesondere ältere Safari- und Firefox-Versionen) lieferten
remote-inbound-rtpgar nicht oder unvollständig. Chrome nutzte früher das nicht standardisierte, Callback-basiertegetStats(). Verwende die Promise-Variante und prüfe die Eigenschaft vor dem Zugriff. - Die Messung wird nur so oft aktualisiert, wie RTCP-Berichte eintreffen (typisch etwa jede Sekunde). Sehr kurze Abfrageintervalle bringen daher nichts.