Start · Sprachen · JavaScript · Referenz · RTCRemoteOutboundRtpStreamStats.roundTripTimeMeasurements

RTCRemoteOutboundRtpStreamStats.roundTripTimeMeasurements

Eigenschaft

Ganzzahliger Zähler, der angibt, wie viele gültige Messungen der Rundlaufzeit (RTT) für den entfernt gesendeten RTP-Strom bisher vorliegen.

seit JavaScript WebRTC Statistics API; nicht in allen Browsern (Un Kategorie: webapi

Signatur

RTCRemoteOutboundRtpStreamStats.roundTripTimeMeasurements

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

Typ
number | undefined
Beschreibung
Nicht-negative ganze Zahl: Anzahl der gültigen RTT-Messungen seit Beginn des Stroms. Der Wert steigt nur an. 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);
audio: 42 Messungen, Ø RTT 38.6 ms

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

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);
}
Messungen: 17

// 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 0 oder fehlt. Eine fehlende RTT-Messung bedeutet also nicht, dass die Verbindung schlecht ist.
  • Division durch null vermeiden: Prüfe vor totalRoundTripTime / roundTripTimeMeasurements immer, ob der Zähler größer als 0 ist.
  • 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 (?? 0 oder 'roundTripTimeMeasurements' in stats).
  • Nicht verwechseln mit ähnlichen Werten: RTCRemoteInboundRtpStreamStats hat 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.