Signatur
Beschreibung
Die Eigenschaft packetsLost eines RTCRemoteInboundRtpStreamStats-Objekts (Statistik-Typ "remote-inbound-rtp") gibt an, wie viele RTP-Pakete, die du selbst gesendet hast, beim entfernten Empfänger nicht angekommen sind. Der Wert kommt nicht aus einer lokalen Messung. Er stammt aus den RTCP-Receiver-Reports (RR), die die Gegenseite regelmäßig zurückschickt.
Berechnet wird der Wert laut RFC 3550 so: Anzahl der erwarteten Pakete minus Anzahl der tatsächlich empfangenen Pakete. Doppelt empfangene Pakete werden als empfangen gezählt. Deshalb kann der Wert in seltenen Fällen negativ sein.
Typische Einsatzgebiete sind die Überwachung der Verbindungsqualität, Anzeigen wie „Schlechte Verbindung“ in Videokonferenzen und die adaptive Anpassung von Bitrate oder Auflösung. Aussagekräftig wird der Wert vor allem als Differenz zwischen zwei Abfragen von RTCPeerConnection.getStats(), zusammen mit packetsSent aus dem zugehörigen outbound-rtp-Eintrag oder mit fractionLost.
Rückgabewert
long long, also mit Vorzeichen): kumulierte Anzahl verlorener RTP-Pakete seit Beginn des Streams, wie vom entfernten Empfänger gemeldet. Der Wert kann negativ sein, wenn Pakete doppelt ankommen.Beispiele
Verlorene Pakete aus getStats() auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logRemoteLoss = async (pc) => {
const stats = await pc.getStats();
stats.forEach((report) => {
if (report.type === 'remote-inbound-rtp') {
console.log(`${report.kind}: ${report.packetsLost} Pakete beim Empfänger verloren`);
}
});
};
await logRemoteLoss(pc);
Verlustrate pro Intervall berechnen
// Vergleicht zwei Abfragen und berechnet die Verlustrate in Prozent
let previous = new Map();
const measureLoss = async (pc) => {
const stats = await pc.getStats();
stats.forEach((remote) => {
if (remote.type !== 'remote-inbound-rtp') return;
const outbound = stats.get(remote.localId); // zugehöriger outbound-rtp-Eintrag
if (!outbound) return;
const prev = previous.get(remote.id);
if (prev) {
const lost = remote.packetsLost - prev.lost;
const sent = outbound.packetsSent - prev.sent;
const rate = sent > 0 ? (Math.max(lost, 0) / sent) * 100 : 0;
console.log(`${remote.kind}: ${rate.toFixed(1)} % Verlust`);
}
previous.set(remote.id, { lost: remote.packetsLost, sent: outbound.packetsSent });
});
};
setInterval(() => measureLoss(pc), 2000);
Warnung bei schlechter Verbindung anzeigen
const warnOnLoss = async (sender) => {
// getStats() auf einem RTCRtpSender liefert nur dessen Statistiken
const stats = await sender.getStats();
for (const report of stats.values()) {
if (report.type === 'remote-inbound-rtp' && report.fractionLost > 0.05) {
console.warn(`Hoher Paketverlust: insgesamt ${report.packetsLost} Pakete`);
}
}
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
if (videoSender) await warnOnLoss(videoSender);
// Wichtig · Fallstricke
- Verzögerte Werte: RTCP-Reports kommen meist nur alle paar Sekunden. Der Wert zeigt deshalb nie den aktuellen Stand und kann zwischen zwei Abfragen unverändert bleiben.
- Kann negativ sein: Doppelt ankommende Pakete können die Zählung unter null drücken. Differenzen solltest du mit
Math.max(…, 0)absichern. - Kumulativ: Der Wert zählt seit Beginn des Streams immer weiter. Aktuelle Verlustraten bekommst du nur, wenn du die Differenz zwischen zwei Abfragen bildest oder
fractionLostverwendest. - Nicht verwechseln mit
RTCInboundRtpStreamStats.packetsLost(Typinbound-rtp). Dieser Wert beschreibt den Verlust bei den Paketen, die du empfängst. - Einträge vom Typ
remote-inbound-rtpgibt es erst, wenn der erste RTCP-Report eingetroffen ist, also nicht direkt nach dem Verbindungsaufbau. - Browser-Kompatibilität: Chromium, Firefox und Safari unterstützen die Eigenschaft. Ältere Versionen haben aber zum Teil veraltete Statistik-Formate genutzt, etwa das callback-basierte
getStats()in Chrome. Prüfe den Wert deshalb vor der Nutzung aufundefined.