Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.totalAssemblyTime

RTCInboundRtpStreamStats.totalAssemblyTime

Eigenschaft

Gesamtzeit in Sekunden, die für das Zusammensetzen erfolgreich dekodierter Videoframes aus mehreren RTP-Paketen verbraucht wurde.

seit JavaScript Eingeschränkte Unterstützung (v. a. Chromium-Brows Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.totalAssemblyTime

Beschreibung

Die Eigenschaft totalAssemblyTime des Wörterbuchs RTCInboundRtpStreamStats ist eine Gleitkommazahl. Sie gibt die aufsummierte Zeit in Sekunden an, die für das Zusammensetzen von Videoframes gebraucht wurde. Mitgezählt werden nur Frames, die in mehreren RTP-Paketen ankamen und danach erfolgreich dekodiert wurden. Für jeden solchen Frame zählt die Zeit zwischen dem ersten und dem letzten empfangenen Paket des Frames.

Der Wert wächst ständig weiter. Allein sagt er deshalb wenig aus. Sinnvoll wird er zusammen mit framesAssembledFromMultiplePackets: Wenn du totalAssemblyTime durch diese Anzahl teilst, erhältst du die durchschnittliche Zusammensetzungszeit pro Frame. Dieser Wert zeigt, wie stark das Netzwerk die Pakete eines Frames zeitlich auseinanderzieht, zum Beispiel durch Jitter, Pacing oder Neuübertragungen.

Die Eigenschaft gibt es nur bei eingehenden Video-Streams (kind === "video"). Du liest sie aus dem RTCStatsReport aus, den RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() liefert. Dort suchst du die Einträge vom Typ "inbound-rtp".

Rückgabewert

Typ
number | undefined
Beschreibung
Aufsummierte Zusammensetzungszeit in Sekunden (double). undefined, wenn der Browser den Wert nicht liefert, zum Beispiel bei Audio-Streams oder fehlender Unterstützung.

Beispiele

Wert aus getStats() auslesen

// pc ist eine bestehende RTCPeerConnection mit eingehendem Video
const logAssemblyTime = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'inbound-rtp' && stats.kind === 'video') {
      console.log(`Gesamte Zusammensetzungszeit: ${stats.totalAssemblyTime?.toFixed(3)} s`);
    }
  });
};

await logAssemblyTime(pc);
Gesamte Zusammensetzungszeit: 1.482 s

Durchschnittliche Zusammensetzungszeit pro Frame

const averageAssemblyMs = async (receiver) => {
  const report = await receiver.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'inbound-rtp') continue;
    const { totalAssemblyTime, framesAssembledFromMultiplePackets: frames } = stats;
    if (totalAssemblyTime === undefined || !frames) return null;
    return (totalAssemblyTime / frames) * 1000;
  }
  return null;
};

const videoReceiver = pc.getReceivers().find((r) => r.track?.kind === 'video');
const avg = await averageAssemblyMs(videoReceiver);
console.log(avg !== null ? `Ø ${avg.toFixed(2)} ms pro Frame` : 'Keine Daten');
Ø 4.37 ms pro Frame

Laufende Überwachung mit Differenzwerten

// Durchschnitt im jeweils letzten Intervall statt über die gesamte Sitzung
let prev = null;

const sample = async () => {
  const report = await pc.getStats();
  const s = [...report.values()].find(
    (x) => x.type === 'inbound-rtp' && x.kind === 'video'
  );
  if (!s || s.totalAssemblyTime === undefined) return;

  if (prev) {
    const dTime = s.totalAssemblyTime - prev.totalAssemblyTime;
    const dFrames = s.framesAssembledFromMultiplePackets - prev.framesAssembledFromMultiplePackets;
    if (dFrames > 0) {
      const ms = (dTime / dFrames) * 1000;
      console.log(`Intervall-Ø: ${ms.toFixed(2)} ms`);
      if (ms > 20) console.warn('Hohe Zusammensetzungszeit – Netzwerk-Jitter prüfen');
    }
  }
  prev = s;
};

const timer = setInterval(sample, 2000);
// später: clearInterval(timer);
Intervall-Ø: 3.91 ms Intervall-Ø: 24.10 ms Hohe Zusammensetzungszeit – Netzwerk-Jitter prüfen

// Wichtig · Fallstricke

  • Einheit: Der Wert wird in Sekunden angegeben, nicht in Millisekunden. Für Anzeigen musst du ihn selbst umrechnen.
  • Summenwert: Der Wert zählt ab Beginn der Sitzung immer weiter hoch. Wenn du aktuelle Werte brauchst, bilde Differenzen zwischen zwei getStats()-Aufrufen.
  • Welche Frames zählen: Frames aus nur einem Paket und Frames, die nicht dekodiert werden konnten, fließen nicht ein. Teile deshalb immer durch framesAssembledFromMultiplePackets, nicht durch framesDecoded.
  • Nur Video: Bei Audio-Streams ist die Eigenschaft nicht vorhanden.
  • Kompatibilität: Die Eigenschaft wird derzeit vor allem von Chromium-Browsern (Chrome, Edge) unterstützt. In anderen Browsern kann sie fehlen. Prüfe deshalb auf undefined, bevor du den Wert verwendest.