Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.lastPacketReceivedTimestamp

RTCInboundRtpStreamStats.lastPacketReceivedTimestamp

Eigenschaft

Gibt als <code>DOMHighResTimeStamp</code> an, wann das zuletzt empfangene RTP-Paket dieses eingehenden Streams (SSRC) beim lokalen Endpunkt angekommen ist.

seit JavaScript Chrome/Edge, Firefox, Safari (WebRTC Statistics AP Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.lastPacketReceivedTimestamp

Beschreibung

Die Eigenschaft lastPacketReceivedTimestamp gehört zum Statistik-Wörterbuch RTCInboundRtpStreamStats, das du über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() als Eintrag mit type === "inbound-rtp" erhältst. Sie enthält den Zeitpunkt in Millisekunden, zu dem das letzte RTP-Paket für diese Quelle (SSRC) empfangen wurde.

Wichtig ist der Unterschied zu timestamp: timestamp gibt an, wann der Statistikbericht erzeugt wurde, während lastPacketReceivedTimestamp angibt, wann tatsächlich zuletzt Daten ankamen. Die Differenz beider Werte zeigt, wie lange der Stream schon „still“ ist.

Typische Einsatzzwecke sind:

  • Stillstand erkennen – z. B. wenn die Gegenseite ihre Kamera ausschaltet, das Netz abbricht oder ein Stream eingefroren ist.
  • Verbindungsüberwachung in Dashboards und Qualitätsmetriken (Monitoring, Telemetrie).
  • Automatische Reaktionen wie Hinweise an Nutzer („Verbindung instabil“) oder ein ICE-Neustart.

Rückgabewert

Typ
number (DOMHighResTimeStamp) | undefined
Beschreibung
Zeitpunkt des Empfangs des letzten Pakets in Millisekunden, auf derselben Zeitbasis wie RTCStats.timestamp. undefined, wenn noch kein Paket empfangen wurde oder der Browser die Eigenschaft nicht unterstützt.

Beispiele

Letzten Paketeingang aller eingehenden Streams ausgeben

// pc ist eine bestehende, verbundene RTCPeerConnection
const logLastPackets = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === "inbound-rtp") {
      console.log(
        `${stats.kind} (SSRC ${stats.ssrc}): letztes Paket bei`,
        stats.lastPacketReceivedTimestamp
      );
    }
  });
};

await logLastPackets(pc);
video (SSRC 123456789): letztes Paket bei 1718000123456.789 audio (SSRC 987654321): letztes Paket bei 1718000123460.12

Eingefrorenen Stream erkennen

const STALL_MS = 2000;

const checkStall = async (receiver) => {
  const report = await receiver.getStats();
  for (const stats of report.values()) {
    if (stats.type !== "inbound-rtp") continue;

    const last = stats.lastPacketReceivedTimestamp;
    if (last === undefined) {
      console.log(`${stats.kind}: noch keine Pakete empfangen`);
      continue;
    }

    // Differenz zwischen Berichtszeit und letztem Paket
    const silence = stats.timestamp - last;
    if (silence > STALL_MS) {
      console.warn(`${stats.kind}: seit ${Math.round(silence)} ms keine Daten`);
    }
  }
};

// Jede Sekunde für alle Empfänger prüfen
const timer = setInterval(() => {
  pc.getReceivers().forEach(checkStall);
}, 1000);
video: seit 3412 ms keine Daten

Neue Pakete zwischen zwei Messungen feststellen

const previous = new Map();

const hasNewPackets = async (pc) => {
  const report = await pc.getStats();
  const result = {};
  report.forEach((s) => {
    if (s.type !== "inbound-rtp") return;
    const before = previous.get(s.id);
    result[s.kind] = before === undefined || s.lastPacketReceivedTimestamp > before;
    previous.set(s.id, s.lastPacketReceivedTimestamp);
  });
  return result;
};

console.log(await hasNewPackets(pc));
{ audio: true, video: false }

// Wichtig · Fallstricke

  • Nicht mit timestamp verwechseln: timestamp ist der Erzeugungszeitpunkt des Berichts, nicht der Paketeingang. Vergleiche lastPacketReceivedTimestamp immer mit timestamp desselben Berichts statt mit Date.now() oder performance.now() – die Zeitbasis kann je nach Browser unterschiedlich sein (Unix-Epoche vs. performance.timeOrigin).
  • Solange noch kein Paket angekommen ist, fehlt die Eigenschaft (undefined) – vor Berechnungen prüfen, sonst entsteht NaN.
  • Pausiert die Gegenseite bewusst (z. B. track.enabled = false), senden manche Implementierungen weiterhin Pakete (Schwarzbilder/Stille), andere nicht. Ein Stillstand bedeutet also nicht zwingend einen Netzwerkfehler.
  • Die Werte werden von Browsern ggf. gecacht und nur in Intervallen aktualisiert; sehr kurze Abfrageintervalle (< 100 ms) liefern keine genaueren Ergebnisse und kosten Rechenzeit.
  • Kompatibilität: Unterstützt in Chromium-Browsern, Firefox und Safari, ältere Versionen liefern die Eigenschaft teils nicht. Mit Fallback programmieren, z. B. über Änderungen von packetsReceived.