Signatur
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
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);
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));
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();
// 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 mitkind === "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
freezeCountundtotalFreezesDurationmeist aussagekräftiger. Eine hohepauseCountzeigt oft nur, dass die Gegenseite ihre Kamera deaktiviert hat. - Der Wert steigt nur:
pauseCountzä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 dieiddes 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.