Start · Sprachen · JavaScript · Referenz · RTCRemoteInboundRtpStreamStats.packetsLost

RTCRemoteInboundRtpStreamStats.packetsLost

Eigenschaft

Gibt die Gesamtzahl der RTP-Pakete einer SSRC an, die laut RTCP-Receiver-Report des entfernten Endpunkts seit Beginn der Übertragung verloren gegangen sind.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (WebRTC-St Kategorie: webapi

Signatur

RTCRemoteInboundRtpStreamStats.packetsLost

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

Typ
number
Beschreibung
Ganzzahl (in der Spezifikation 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);
video: 42 Pakete beim Empfänger verloren audio: 3 Pakete beim Empfänger verloren

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);
video: 1.8 % Verlust audio: 0.0 % Verlust

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);
Hoher Paketverlust: insgesamt 318 Pakete

// 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 fractionLost verwendest.
  • Nicht verwechseln mit RTCInboundRtpStreamStats.packetsLost (Typ inbound-rtp). Dieser Wert beschreibt den Verlust bei den Paketen, die du empfängst.
  • Einträge vom Typ remote-inbound-rtp gibt 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 auf undefined.