Signatur
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
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);
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);
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));
// Wichtig · Fallstricke
- Nicht mit
timestampverwechseln:timestampist der Erzeugungszeitpunkt des Berichts, nicht der Paketeingang. VergleichelastPacketReceivedTimestampimmer mittimestampdesselben Berichts statt mitDate.now()oderperformance.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 entstehtNaN. - 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.