Start · Sprachen · JavaScript · Referenz · RTCRemoteInboundRtpStreamStats.timestamp

RTCRemoteInboundRtpStreamStats.timestamp

Eigenschaft

Ein <code>DOMHighResTimeStamp</code>, der angibt, wann die Daten dieses <code>remote-inbound-rtp</code>-Statistikobjekts erfasst wurden.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (WebRTC-St Kategorie: webapi

Signatur

RTCRemoteInboundRtpStreamStats.timestamp

Beschreibung

Die Eigenschaft timestamp eines RTCRemoteInboundRtpStreamStats-Objekts (Statistiktyp "remote-inbound-rtp") enthält einen DOMHighResTimeStamp in Millisekunden. Er gibt an, wann die Statistikdaten erfasst wurden. Das Objekt selbst beschreibt, wie die Gegenstelle einen von dir gesendeten RTP-Stream empfängt. Die Werte stammen aus RTCP-Receiver-Reports (RR) der Gegenstelle, z. B. Paketverlust, Jitter und Round-Trip-Time.

Der Zeitstempel bezieht sich auf die Performance-Zeitachse und nicht auf die Unix-Epoche. Damit lassen sich zwei Abfragen per RTCPeerConnection.getStats() genau vergleichen. Aus der Differenz zweier timestamp-Werte kannst du zusammen mit den Zählerwerten (z. B. packetsLost) Raten pro Sekunde berechnen.

Bei Remote-Statistiken ist zu beachten, dass die Daten nur aktualisiert werden, wenn ein neuer RTCP-Report eintrifft, meist etwa alle 1–5 Sekunden. Laut Spezifikation entspricht timestamp bei remote-*-Statistiken dem Zeitpunkt, zu dem der Report lokal empfangen wurde. Deshalb kann er zwischen mehreren kurz nacheinander ausgeführten getStats()-Aufrufen gleich bleiben.

Rückgabewert

Typ
DOMHighResTimeStamp (number)
Beschreibung
Zeitpunkt der Datenerfassung in Millisekunden (Gleitkommazahl) auf der Performance-Zeitachse. Er ist vergleichbar mit performance.timeOrigin + performance.now(), in manchen Browsern auch mit Date.now().

Beispiele

Zeitstempel und Round-Trip-Time auslesen

const pc = new RTCPeerConnection();
// ... Verbindung aufbauen, Tracks hinzufügen ...

const logRemoteInbound = async () => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'remote-inbound-rtp') {
      console.log(`${stats.kind}: erfasst bei ${stats.timestamp.toFixed(1)} ms, RTT ${stats.roundTripTime ?? '–'} s`);
    }
  });
};

setInterval(logRemoteInbound, 2000);
video: erfasst bei 1718032451234.5 ms, RTT 0.042 s

Paketverlust pro Sekunde über die timestamp-Differenz

const previous = new Map();

const computeLossRate = async (pc) => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'remote-inbound-rtp') continue;
    const prev = previous.get(stats.id);
    // Nur rechnen, wenn ein neuer RTCP-Report vorliegt
    if (prev && stats.timestamp > prev.timestamp) {
      const seconds = (stats.timestamp - prev.timestamp) / 1000;
      const lost = stats.packetsLost - prev.packetsLost;
      console.log(`${stats.kind}: ${(lost / seconds).toFixed(2)} verlorene Pakete/s`);
    }
    previous.set(stats.id, { timestamp: stats.timestamp, packetsLost: stats.packetsLost });
  }
};

setInterval(() => computeLossRate(pc), 3000);
audio: 0.33 verlorene Pakete/s

Alter der Remote-Statistik bestimmen

const getStatsAge = async (sender) => {
  const report = await sender.getStats();
  const remote = [...report.values()].find((s) => s.type === 'remote-inbound-rtp');
  if (!remote) return null;
  // timestamp liegt auf der Zeitachse performance.timeOrigin + performance.now()
  const now = performance.timeOrigin + performance.now();
  return Math.round(now - remote.timestamp);
};

const [sender] = pc.getSenders();
console.log(`Remote-Report ist ${await getStatsAge(sender)} ms alt`);
Remote-Report ist 812 ms alt

// Wichtig · Fallstricke

  • Kein Unix-Zeitstempel in Sekunden: Der Wert ist in Millisekunden angegeben und enthält Nachkommastellen. Zum Anzeigen erzeugst du ein Datum mit new Date(stats.timestamp). Das funktioniert nur, wenn der Browser die Performance-Zeitachse an der Epoche ausrichtet, was in aktuellen Browsern der Fall ist.
  • Werte können unverändert bleiben: Remote-Statistiken ändern sich nur, wenn ein neuer RTCP-Report eintrifft. Prüfe timestamp auf Änderung, bevor du Raten berechnest. Sonst teilst du durch 0 oder bekommst falsche Spitzenwerte.
  • Zeitstempel verschiedener Statistiktypen sind nicht unbedingt gleich, auch wenn sie aus demselben getStats()-Aufruf stammen. Das gilt z. B. für outbound-rtp im Vergleich zu remote-inbound-rtp.
  • Kompatibilität: remote-inbound-rtp wird von Chromium, Firefox und Safari unterstützt. Welche weiteren Felder vorhanden sind, unterscheidet sich je nach Browser, z. B. roundTripTime oder fractionLost. Veraltete Callback-Varianten von getStats() solltest du nicht mehr verwenden.