Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.totalPausesDuration

RTCInboundRtpStreamStats.totalPausesDuration

Eigenschaft

Gibt an, wie lange das empfangene Video in diesem eingehenden RTP-Stream insgesamt pausiert war, in Sekunden. Gilt nur für Video-Streams.

seit JavaScript WebRTC Statistics API; Unterstützung vor allem in Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.totalPausesDuration

Beschreibung

Die Eigenschaft totalPausesDuration des Wörterbuchs RTCInboundRtpStreamStats summiert, wie lange die Videowiedergabe eines eingehenden Streams pausiert war. Der Wert ist eine Gleitkommazahl in Sekunden. (MDN ordnet die Eigenschaft teilweise fälschlich RTCRemoteInboundRtpStreamStats zu. Richtig ist RTCInboundRtpStreamStats, also Statistikobjekte mit type === "inbound-rtp".)

Laut WebRTC-Statistik-Spezifikation liegt eine Pause vor, wenn zwischen zwei gerenderten Bildern mehr als 5 Sekunden vergehen. Das passiert typischerweise, wenn die Gegenseite ihre Video-Spur deaktiviert (track.enabled = false), der Sender pausiert oder keine Bilder mehr ankommen. Jede Pause erhöht außerdem pauseCount. Kürzere Aussetzer gelten dagegen als Freeze und werden in freezeCount und totalFreezesDuration gezählt.

Die Eigenschaft ist nützlich für Dashboards zur Anrufqualität, zur Fehlersuche und für QoE-Metriken (Quality of Experience). Mit ihr lassen sich zum Beispiel absichtliche Kamerapausen von echten Qualitätsproblemen wie Rucklern unterscheiden. Du liest den Wert über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() aus. Weil er über die Lebensdauer des Streams nur wächst, bildest du für Zeiträume die Differenz zwischen zwei Abfragen.

Rückgabewert

Typ
number | undefined
Beschreibung
Gesamtdauer aller erkannten Pausen in Sekunden, als Gleitkommazahl und kumulativ. Bei Audio-Streams oder in Browsern ohne Unterstützung ist der Wert undefined.

Beispiele

Pausendauer aller eingehenden Video-Streams auslesen

// pc ist eine bestehende, verbundene RTCPeerConnection
const logPauses = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'inbound-rtp' && stats.kind === 'video') {
      console.log(
        `Stream ${stats.ssrc}: ${stats.pauseCount ?? 0} Pausen, ` +
        `insgesamt ${(stats.totalPausesDuration ?? 0).toFixed(1)} s`
      );
    }
  });
};

await logPauses(pc);
Stream 1234567890: 2 Pausen, insgesamt 14.3 s

Pausen pro Messintervall überwachen (Differenzbildung)

const receiver = pc.getReceivers().find((r) => r.track?.kind === 'video');
let previous = 0;

const timer = setInterval(async () => {
  const report = await receiver.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'inbound-rtp') continue;
    const total = stats.totalPausesDuration ?? 0;
    const delta = total - previous;
    previous = total;
    if (delta > 0) {
      console.warn(`Video war in den letzten 10 s ${delta.toFixed(1)} s pausiert`);
    }
  }
}, 10_000);

// Beim Auflegen: clearInterval(timer);
Video war in den letzten 10 s 6.2 s pausiert

Pausen- und Freeze-Anteil für ein QoE-Dashboard berechnen

const videoQuality = async (pc, callStart) => {
  const report = await pc.getStats();
  const inbound = [...report.values()].find(
    (s) => s.type === 'inbound-rtp' && s.kind === 'video'
  );
  if (!inbound || inbound.totalPausesDuration === undefined) {
    return null; // nicht unterstützt oder kein Video
  }
  const elapsed = (performance.now() - callStart) / 1000;
  return {
    pausenAnteil: +(inbound.totalPausesDuration / elapsed * 100).toFixed(1),
    freezeAnteil: +((inbound.totalFreezesDuration ?? 0) / elapsed * 100).toFixed(1)
  };
};

const start = performance.now();
// ... später:
console.log(await videoQuality(pc, start));
{ pausenAnteil: 4.8, freezeAnteil: 0.7 }

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die Eigenschaft wird vor allem von Chromium-Browsern (Chrome, Edge, Opera) geliefert. In Firefox und Safari kann sie fehlen, dann ist sie undefined. Prüfe deshalb immer, ob sie existiert, oder nutze ?? 0.
  • Nur Video: Bei Audio-Statistiken (kind === "audio") gibt es die Eigenschaft nicht.
  • Kumulativ: Der Wert wird nie zurückgesetzt. Für einzelne Zeitabschnitte brauchst du die Differenz zweier Messungen.
  • Pause oder Freeze: Erst Lücken über 5 Sekunden zählen als Pause. Kürzere Aussetzer erscheinen in totalFreezesDuration. Eine Pause ist nicht zwingend ein Fehler: Hat die Gegenseite ihre Kamera absichtlich ausgeschaltet, entsteht ebenfalls eine Pause.
  • Ob eine gerade laufende, noch nicht beendete Pause schon mitgezählt wird, kann je nach Implementierung verschieden sein. Werte also erst nach dem nächsten gerenderten Bild zuverlässig aus.