Signatur
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
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);
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);
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`);
// 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
timestampauf Ä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üroutbound-rtpim Vergleich zuremote-inbound-rtp. - Kompatibilität:
remote-inbound-rtpwird von Chromium, Firefox und Safari unterstützt. Welche weiteren Felder vorhanden sind, unterscheidet sich je nach Browser, z. B.roundTripTimeoderfractionLost. Veraltete Callback-Varianten vongetStats()solltest du nicht mehr verwenden.