Start · Sprachen · JavaScript · Referenz · RTCRemoteInboundRtpStreamStats.roundTripTimeMeasurements

RTCRemoteInboundRtpStreamStats.roundTripTimeMeasurements

Eigenschaft

Gesamtanzahl gültiger Round-Trip-Zeitmessungen (RTT), die für diesen entfernt empfangenen RTP-Stream aus RTCP-Empfängerberichten ermittelt wurden.

seit JavaScript Chrome 96+, Firefox 109+, Safari 16.4+ (nicht über Kategorie: webapi

Signatur

RTCRemoteInboundRtpStreamStats.roundTripTimeMeasurements

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

Typ
number
Beschreibung
Nicht negative Ganzzahl (unsigned long long): die Anzahl gültiger RTT-Messungen seit Beginn der Sitzung. Der Wert steigt nur an, er wird nie kleiner.

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);
audio: 42 Messungen video: 40 Messungen

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: 38.4 ms

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);
RTT (letzte 5 s): 35.2 ms

// Wichtig · Fallstricke

  • Division durch null: Direkt nach dem Verbindungsaufbau ist der Wert 0 oder undefined. Prüfe das immer, bevor du totalRoundTripTime dadurch 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. totalRoundTripTime und roundTripTime werden 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.