Signatur
Beschreibung
Die Eigenschaft totalRoundTripTime eines RTCRemoteOutboundRtpStreamStats-Objekts (Statistiktyp "remote-outbound-rtp") enthält die aufsummierte Round-Trip-Time in Sekunden. Gemeint sind alle Messungen, die seit Beginn der Sitzung für diesen Stream vorgenommen wurden. Der Stream beschreibt aus Sicht des lokalen Empfängers, was die Gegenseite sendet. Die Werte stammen deshalb aus RTCP-Berichten der Gegenstelle.
Für diesen Statistiktyp misst der Browser die RTT über RTCP-Sender-Reports zusammen mit RTCP-XR-Blöcken (Receiver Reference Time Report und DLRR, RFC 3611). Gibt es keinen XR-Austausch, fehlt die Eigenschaft oft ganz oder bleibt bei 0.
Einzeln ist der Wert wenig aussagekräftig. Nützlich wird er zusammen mit roundTripTimeMeasurements: totalRoundTripTime / roundTripTimeMeasurements ergibt die durchschnittliche RTT über die ganze Sitzung. Wenn du die Differenzen zweier Abfragen vergleichst, bekommst du den Durchschnitt für einen bestimmten Zeitraum. Das eignet sich gut für Diagramme zur Verbindungsqualität. Den zuletzt gemessenen Einzelwert liefert roundTripTime.
Rückgabewert
double). undefined, wenn der Browser noch keine RTT für diesen Stream messen konnte.Beispiele
Durchschnittliche RTT seit Sitzungsbeginn ermitteln
// pc ist eine verbundene RTCPeerConnection
const logeDurchschnittsRtt = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'remote-outbound-rtp') return;
const { totalRoundTripTime, roundTripTimeMeasurements, kind } = stats;
if (totalRoundTripTime === undefined || !roundTripTimeMeasurements) {
console.log(`${kind}: keine RTT-Messungen verfügbar`);
return;
}
const avgMs = (totalRoundTripTime / roundTripTimeMeasurements) * 1000;
console.log(`${kind}: Ø RTT ${avgMs.toFixed(1)} ms`);
});
};
await logeDurchschnittsRtt(pc);
RTT-Durchschnitt pro Zeitraum (Differenz zweier Abfragen)
const vorherige = new Map();
const messeIntervall = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'remote-outbound-rtp' || stats.totalRoundTripTime === undefined) continue;
const alt = vorherige.get(stats.id);
if (alt) {
const dZeit = stats.totalRoundTripTime - alt.totalRoundTripTime;
const dAnzahl = stats.roundTripTimeMeasurements - alt.roundTripTimeMeasurements;
if (dAnzahl > 0) {
console.log(`${stats.kind}: RTT im Intervall ${(dZeit / dAnzahl * 1000).toFixed(1)} ms`);
}
}
vorherige.set(stats.id, {
totalRoundTripTime: stats.totalRoundTripTime,
roundTripTimeMeasurements: stats.roundTripTimeMeasurements
});
}
};
const timer = setInterval(() => messeIntervall(pc), 5000);
// später: clearInterval(timer);
Werte über den Empfänger eines Tracks abfragen
const [receiver] = pc.getReceivers();
const report = await receiver.getStats();
const remote = [...report.values()].find((s) => s.type === 'remote-outbound-rtp');
console.log('Gesamt-RTT (s):', remote?.totalRoundTripTime ?? 'nicht verfügbar');
// Wichtig · Fallstricke
- Einheit Sekunden: Der Wert ist eine Summe in Sekunden, keine Angabe in Millisekunden und kein Durchschnitt. Für die mittlere RTT teilst du ihn immer durch
roundTripTimeMeasurements. Prüfe vorher, dass diese Zahl größer als0ist, sonst teilst du durch null. - Hängt von RTCP XR ab: Die RTT in
remote-outbound-rtplässt sich nur mit DLRR-/RRTR-Blöcken (RFC 3611) messen. Handeln die Gegenstellen das nicht aus, etwa bei manchen SFUs, Gateways oder älteren Browsern, fehlt der Wert. - Nicht verwechseln: Die RTT für deine eigenen gesendeten Streams findest du in
RTCRemoteInboundRtpStreamStats.totalRoundTripTime("remote-inbound-rtp"). Die RTT auf Transportebene steht inRTCIceCandidatePairStats.totalRoundTripTime. - Browser-Unterstützung: Firefox liefert
remote-outbound-rtpsamt RTT-Feldern schon länger. In Chromium-Browsern und Safari ist die Unterstützung von der Version abhängig und teils auf Audio beschränkt. Frage die Eigenschaft deshalb immer defensiv ab, etwa mit?.oder??. - Der Wert steigt nur, wenn neue RTCP-Berichte ankommen, typischerweise alle paar Sekunden. Sehr kurze Abfrageintervalle bringen daher keine zusätzlichen Daten.