Signatur
Beschreibung
Die schreibgeschützte Eigenschaft packetsLost ist Teil der Statistikobjekte vom Typ "inbound-rtp", die RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() zurückgeben. Sie zählt fortlaufend, wie viele RTP-Pakete eines eingehenden Medienstroms (Audio oder Video) seit Beginn des Empfangs von der jeweiligen SSRC verloren gegangen sind. Definiert ist sie im Basis-Wörterbuch RTCReceivedRtpStreamStats, von dem sowohl RTCInboundRtpStreamStats als auch RTCRemoteInboundRtpStreamStats erben.
Berechnet wird der Wert wie in RFC 3550 beschrieben: erwartete Pakete (aus den Sequenznummern abgeleitet) minus tatsächlich empfangene Pakete. Spät eintreffende Pakete zählen dabei nicht als verloren. Doppelt empfangene Pakete zählen als empfangen, deshalb kann der Wert unter Umständen negativ werden.
In der Praxis dient packetsLost zur Überwachung der Verbindungsqualität. Zusammen mit packetsReceived lässt sich eine Paketverlustrate berechnen, zum Beispiel für eine Qualitätsanzeige, adaptive Auflösung oder Telemetrie. Da es sich um einen kumulativen Zähler handelt, sollte man für aktuelle Werte immer die Differenz zwischen zwei Messungen betrachten.
Rückgabewert
long long, also vorzeichenbehaftet) mit der kumulierten Anzahl verlorener RTP-Pakete. Durch doppelt empfangene Pakete kann sie negativ sein.Beispiele
Verlorene Pakete aller eingehenden Ströme ausgeben
// pc ist eine bestehende, verbundene RTCPeerConnection
const logPacketLoss = async (pc) => {
const stats = await pc.getStats();
stats.forEach((report) => {
if (report.type === 'inbound-rtp') {
console.log(`${report.kind} (SSRC ${report.ssrc}): ${report.packetsLost} Pakete verloren`);
}
});
};
await logPacketLoss(pc);
Gesamte Paketverlustrate eines Video-Empfängers berechnen
const getLossRate = async (receiver) => {
const stats = await receiver.getStats();
for (const report of stats.values()) {
if (report.type === 'inbound-rtp') {
const lost = Math.max(0, report.packetsLost ?? 0);
const received = report.packetsReceived ?? 0;
const total = lost + received;
return total > 0 ? (lost / total) * 100 : 0;
}
}
return null;
};
const videoReceiver = pc.getReceivers().find((r) => r.track.kind === 'video');
const rate = await getLossRate(videoReceiver);
console.log(`Paketverlust: ${rate.toFixed(2)} %`);
Aktuellen Paketverlust per Intervall überwachen (Differenzen)
const monitorLoss = (pc, intervalMs = 2000) => {
const previous = new Map(); // id -> { lost, received }
return setInterval(async () => {
const stats = await pc.getStats();
stats.forEach((r) => {
if (r.type !== 'inbound-rtp') return;
const prev = previous.get(r.id) ?? { lost: 0, received: 0 };
const dLost = r.packetsLost - prev.lost;
const dRecv = r.packetsReceived - prev.received;
const total = dLost + dRecv;
const pct = total > 0 ? Math.max(0, dLost) / total * 100 : 0;
if (pct > 5) {
console.warn(`${r.kind}: hoher Paketverlust (${pct.toFixed(1)} %)`);
}
previous.set(r.id, { lost: r.packetsLost, received: r.packetsReceived });
});
}, intervalMs);
};
const timer = monitorLoss(pc);
// später: clearInterval(timer);
// Wichtig · Fallstricke
- Kumulativer Zähler: Der Wert steigt über die gesamte Lebensdauer des Stroms. Für die aktuelle Qualität nimmst du die Differenz zwischen zwei
getStats()-Aufrufen, sonst verwässern alte Verluste das Ergebnis. - Negative Werte möglich: Doppelt empfangene Pakete können den Wert unter null drücken. Vor Prozentrechnungen solltest du ihn mit
Math.max(0, …)absichern. - Nicht verwechseln: Bei
"remote-inbound-rtp"meldet die Gegenseite per RTCP, wie viele Pakete deines ausgehenden Stroms verloren gingen."inbound-rtp"beschreibt dagegen die Pakete, die lokal fehlen. - Paketverluste, die durch NACK/Neuübertragung oder FEC ausgeglichen werden, können trotzdem mitgezählt werden. Ein Wert über 0 heißt also nicht zwingend, dass Bild- oder Tonausfälle hörbar oder sichtbar waren.
- Kompatibilität: Wird von allen modernen Browsern unterstützt. Ältere Implementierungen nutzten zum Teil den veralteten Typ
"ssrc"oder legacy-getStats()-Callbacks. Den Typreport.typeimmer prüfen und fehlende Werte abfangen (?? 0).