Signatur
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
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);
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);
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));
// 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.