Start · Sprachen · JavaScript · Referenz · RTCVideoSourceStats.timestamp

RTCVideoSourceStats.timestamp

Eigenschaft

Ein <code>DOMHighResTimeStamp</code>, der angibt, zu welchem Zeitpunkt die Statistikdaten der Videoquelle erfasst wurden.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (mit WebRT Kategorie: webapi

Signatur

RTCVideoSourceStats.timestamp

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

Typ
DOMHighResTimeStamp (number)
Beschreibung
Zeitpunkt der Datenerfassung in Millisekunden, als Gleitkommazahl mit Nachkommastellen.

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);
Erfasst bei 1706123456789.4 ms Auflösung: 1280x720

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);
Gemessene Bildrate: 29.8 fps

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() oder performance.now() mischen.
  • Zwischenspeicherung: Browser können Statistiken kurzzeitig zwischenspeichern. Zwei schnell nacheinander folgende getStats()-Aufrufe können deshalb denselben timestamp liefern. Vor einer Division durch die Zeitdifferenz sollte man daher auf Null prüfen.
  • Die Eigenschaft ist schreibgeschützt und wird von RTCStats geerbt. Alle Statistiktypen haben sie.
  • Firefox unterstützt RTCVideoSourceStats erst in neueren Versionen und nicht mit allen Feldern. Vor dem Zugriff auf frames oder framesPerSecond sollte man deshalb prüfen, ob sie vorhanden sind.