Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.pauseCount

RTCInboundRtpStreamStats.pauseCount

Eigenschaft

Gibt an, wie viele Pausen der empfangene Videostrom insgesamt hatte. Eine Pause liegt vor, wenn zwischen zwei gerenderten Bildern mehr als 5 Sekunden vergehen.

seit JavaScript WebRTC Statistics (Entwurf); nur in einigen Browse Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.pauseCount

Beschreibung

Die schreibgeschützte Eigenschaft pauseCount eines RTCInboundRtpStreamStats-Objekts (Statistiktyp "inbound-rtp") ist eine ganze Zahl. Sie zählt, wie viele Pausen es bei der Wiedergabe des empfangenen Videostroms gab. Die Eigenschaft gibt es nur bei Videoströmen. Bei Audio-Einträgen fehlt sie.

Laut Spezifikation wird eine Pause gezählt, wenn ein neues Bild erst mehr als 5 Sekunden nach dem zuletzt gerenderten Bild gerendert wird. So eine Lücke entsteht typischerweise, wenn die Gegenseite ihren Track stummschaltet (track.enabled = false), die Kamera abschaltet oder das Senden bewusst anhält. Kurze Aussetzer zählen dagegen als Freezes und landen in freezeCount. Diese Abgrenzung hilft bei der Auswertung: pauseCount steht eher für gewollte oder lange Unterbrechungen, freezeCount für Qualitätsprobleme durch das Netz oder den Decoder.

Zusammen mit totalPausesDuration (Gesamtdauer aller Pausen in Sekunden) lässt sich die durchschnittliche Pausenlänge berechnen. Die Werte liest du über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() aus. Der Wert steigt während der Sitzung nur an. Wer Veränderungen sehen will, vergleicht deshalb regelmäßig zwei Messungen miteinander.

Hinweis: Manche Dokumentationen nennen fälschlich RTCRemoteInboundRtpStreamStats. Die Eigenschaft gehört aber zu RTCInboundRtpStreamStats, also zu den lokalen Empfangsstatistiken.

Rückgabewert

Typ
number | undefined
Beschreibung
Eine nicht-negative ganze Zahl: die Zahl der Pausen seit Beginn des Empfangs. Ist der Wert undefined, handelt es sich um einen Audiostrom oder der Browser unterstützt die Eigenschaft nicht.

Beispiele

Pausenanzahl aller eingehenden Videoströme 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(`SSRC ${stats.ssrc}: ${stats.pauseCount ?? 'n/v'} Pausen`);
    }
  });
};

await logPauses(pc);
SSRC 123456789: 2 Pausen

Durchschnittliche Pausendauer pro Empfänger berechnen

const pauseInfo = async (receiver) => {
  const report = await receiver.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'inbound-rtp') continue;
    const { pauseCount = 0, totalPausesDuration = 0 } = stats;
    const avg = pauseCount > 0 ? totalPausesDuration / pauseCount : 0;
    return { pauseCount, avgSeconds: Number(avg.toFixed(2)) };
  }
  return null;
};

const videoReceiver = pc.getReceivers().find((r) => r.track?.kind === 'video');
console.log(await pauseInfo(videoReceiver));
{ pauseCount: 3, avgSeconds: 8.47 }

Neue Pausen während eines Calls erkennen (Monitoring)

const watchPauses = (pc, onPause, intervalMs = 2000) => {
  const last = new Map();
  const timer = setInterval(async () => {
    const report = await pc.getStats();
    report.forEach((s) => {
      if (s.type !== 'inbound-rtp' || s.kind !== 'video') return;
      if (typeof s.pauseCount !== 'number') return; // nicht unterstützt
      const prev = last.get(s.id) ?? s.pauseCount;
      if (s.pauseCount > prev) onPause(s, s.pauseCount - prev);
      last.set(s.id, s.pauseCount);
    });
  }, intervalMs);
  return () => clearInterval(timer);
};

const stop = watchPauses(pc, (s, delta) => {
  console.warn(`Video ${s.trackIdentifier}: ${delta} neue Pause(n)`);
});
// später: stop();
Video 7f3a…: 1 neue Pause(n)

// Wichtig · Fallstricke

  • Browser-Unterstützung: Nicht alle Browser unterstützen die Eigenschaft. Chromium-basierte Browser liefern sie, Firefox und Safari je nach Version nicht. Prüfe deshalb immer mit typeof stats.pauseCount === 'number', bevor du den Wert verwendest.
  • Nur Video: Bei inbound-rtp-Einträgen mit kind === "audio" fehlt die Eigenschaft.
  • Pause oder Freeze: Eine Lücke über 5 Sekunden zählt als Pause und nicht zusätzlich als Freeze. Für die Bewertung der Videoqualität sind freezeCount und totalFreezesDuration meist aussagekräftiger. Eine hohe pauseCount zeigt oft nur, dass die Gegenseite ihre Kamera deaktiviert hat.
  • Der Wert steigt nur: pauseCount zählt die Pausen seit Beginn des Stroms zusammen. Wer Änderungen je Zeitraum sehen will, bildet die Differenz zwischen zwei Messungen und verwendet als Schlüssel die id des Statistik-Eintrags.
  • Performance: getStats() ist asynchron und nicht ganz billig. Frage die Werte deshalb höchstens etwa einmal pro Sekunde ab, nicht in jedem Animationsframe.