Signatur
Beschreibung
Die Eigenschaft timestamp des Wörterbuchs RTCVideoSourceStats ist ein DOMHighResTimeStamp in Millisekunden. Er gibt an, wann die im Objekt enthaltenen Werte (z. B. width, height, frames, framesPerSecond) abgetastet wurden. Statistikobjekte vom Typ "media-source" mit kind === "video" beschreiben einen lokalen Video-Track, der an einen RTCRtpSender angehängt ist.
Wichtig ist der Zeitstempel vor allem dann, wenn man Raten berechnen will. Aus zwei aufeinanderfolgenden Berichten kann man mit der Differenz der Zeitstempel z. B. die tatsächliche Bildrate aus frames ableiten. Das ist genauer, als sich auf den Abfrage-Intervall von setInterval() zu verlassen.
Der Wert bezieht sich laut Spezifikation auf den Performance-Zeitursprung. Einige ältere Implementierungen haben jedoch die Unix-Epoche benutzt. Man sollte Zeitstempel deshalb nur untereinander vergleichen, also Differenzen bilden. Absolute Werte sollte man nicht direkt als Uhrzeit auswerten.
Rückgabewert
Beispiele
Zeitstempel der Videoquelle auslesen
// pc ist eine aktive RTCPeerConnection mit gesendetem Video-Track
const logVideoSourceTimestamp = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'media-source' && stats.kind === 'video') {
console.log(`Erfasst bei ${stats.timestamp.toFixed(1)} ms`);
console.log(`Auflösung: ${stats.width}x${stats.height}`);
}
});
};
logVideoSourceTimestamp(pc);
Tatsächliche Bildrate über zwei Messungen berechnen
const getVideoSource = async (sender) => {
const report = await sender.getStats();
return [...report.values()].find(
(s) => s.type === 'media-source' && s.kind === 'video'
);
};
const measureFps = async (sender, intervalMs = 2000) => {
const first = await getVideoSource(sender);
await new Promise((r) => setTimeout(r, intervalMs));
const second = await getVideoSource(sender);
// Zeitdifferenz in Sekunden aus den Zeitstempeln
const seconds = (second.timestamp - first.timestamp) / 1000;
const fps = (second.frames - first.frames) / seconds;
console.log(`Gemessene Bildrate: ${fps.toFixed(1)} fps`);
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
measureFps(videoSender);
Veraltete Statistiken erkennen
let lastTimestamp = 0;
setInterval(async () => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'media-source' || stats.kind !== 'video') continue;
if (stats.timestamp === lastTimestamp) {
console.warn('Keine neuen Daten – Statistik aus dem Cache');
}
lastTimestamp = stats.timestamp;
}
}, 1000);
// Wichtig · Fallstricke
- Bezugspunkt: Chrome hat früher Zeitstempel relativ zur Unix-Epoche geliefert, die Spezifikation verlangt inzwischen den Performance-Zeitursprung. Deshalb nur Differenzen bilden und nicht mit
Date.now()oderperformance.now()mischen. - Zwischenspeicherung: Browser können Statistiken kurzzeitig zwischenspeichern. Zwei schnell nacheinander folgende
getStats()-Aufrufe können deshalb denselbentimestampliefern. Vor einer Division durch die Zeitdifferenz sollte man daher auf Null prüfen. - Die Eigenschaft ist schreibgeschützt und wird von
RTCStatsgeerbt. Alle Statistiktypen haben sie. - Firefox unterstützt
RTCVideoSourceStatserst in neueren Versionen und nicht mit allen Feldern. Vor dem Zugriff aufframesoderframesPerSecondsollte man deshalb prüfen, ob sie vorhanden sind.