Start · Sprachen · JavaScript · Referenz · RTCIceCandidatePairStats.bytesReceived

RTCIceCandidatePairStats.bytesReceived

Eigenschaft

Gesamtanzahl der Nutzdatenbytes, die bisher über die durch das ICE-Kandidatenpaar beschriebene Verbindung empfangen wurden.

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

Signatur

RTCIceCandidatePairStats.bytesReceived

Beschreibung

Die Eigenschaft bytesReceived des Wörterbuchs RTCIceCandidatePairStats enthält die Gesamtzahl der Nutzdatenbytes, die über das jeweilige ICE-Kandidatenpaar empfangen wurden. Gezählt werden nur die Nutzdaten. Header wie IP, UDP/TCP oder TURN-Kapselung sowie ICE-Verbindungsprüfungen (STUN-Pakete) zählen nicht dazu.

Du bekommst den Wert über RTCPeerConnection.getStats(). Der zurückgegebene RTCStatsReport enthält Einträge mit type === "candidate-pair". Welches Paar gerade Daten überträgt, siehst du am Eintrag selectedCandidatePairId der Statistik vom Typ "transport" oder, je nach Browser, an nominated bzw. state === "succeeded".

Einsatzgebiete sind vor allem Bandbreitenmessung, Verbindungsdiagnose und Qualitätsanzeigen in Video- und Sprachanwendungen. Weil der Wert seit Aufbau des Paares nur ansteigt, nimmst du mehrere Messpunkte und rechnest aus der Differenz und dem timestamp eine Empfangsrate aus.

Rückgabewert

Typ
number
Beschreibung
Eine ganze Zahl ohne Vorzeichen (unsigned long long): die bisher empfangenen Nutzdatenbytes über dieses Kandidatenpaar. Kann fehlen (undefined), wenn der Browser den Wert nicht liefert.

Beispiele

Empfangene Bytes des aktiven Kandidatenpaars auslesen

const logBytesReceived = async (pc) => {
  const report = await pc.getStats();
  let selectedId;
  report.forEach((stat) => {
    if (stat.type === 'transport' && stat.selectedCandidatePairId) {
      selectedId = stat.selectedCandidatePairId;
    }
  });

  const pair = selectedId
    ? report.get(selectedId)
    : [...report.values()].find(
        (s) => s.type === 'candidate-pair' && s.nominated && s.state === 'succeeded'
      );

  if (pair) {
    console.log(`Empfangen: ${pair.bytesReceived} Bytes`);
  }
};

// pc ist eine verbundene RTCPeerConnection
logBytesReceived(pc);
Empfangen: 1843290 Bytes

Empfangsrate in kbit/s messen

const monitorIncomingBitrate = (pc, intervalMs = 1000) => {
  let last = null;

  return setInterval(async () => {
    const report = await pc.getStats();
    for (const stat of report.values()) {
      if (stat.type !== 'candidate-pair' || !stat.nominated) continue;

      if (last && last.id === stat.id) {
        const bytes = stat.bytesReceived - last.bytesReceived;
        const seconds = (stat.timestamp - last.timestamp) / 1000;
        const kbps = ((bytes * 8) / seconds / 1000).toFixed(1);
        console.log(`Eingehend: ${kbps} kbit/s`);
      }
      last = { id: stat.id, bytesReceived: stat.bytesReceived, timestamp: stat.timestamp };
    }
  }, intervalMs);
};

const timer = monitorIncomingBitrate(pc);
// Später beenden: clearInterval(timer);
Eingehend: 1523.4 kbit/s

Alle Kandidatenpaare tabellarisch vergleichen

const report = await pc.getStats();
const pairs = [...report.values()]
  .filter((s) => s.type === 'candidate-pair')
  .map(({ id, state, nominated, bytesReceived = 0, bytesSent = 0 }) => ({
    id, state, nominated, bytesReceived, bytesSent
  }));

console.table(pairs);
Tabelle mit id, state, nominated, bytesReceived, bytesSent je Kandidatenpaar

// Wichtig · Fallstricke

  • Nur Nutzdaten: Header (IP, UDP, TCP, TURN) und STUN-Verbindungsprüfungen werden nicht mitgezählt. Die tatsächliche Netzlast liegt also höher.
  • Kumulativer Zähler: Der Wert steigt nur an. Eine Rate bekommst du nur aus der Differenz zweier Messungen, geteilt durch die Differenz ihrer timestamp-Werte (in Millisekunden).
  • Paarwechsel: Nach einem ICE-Neustart oder einem Wechsel des Netzwerks kann ein anderes Kandidatenpaar aktiv werden. Das neue Paar hat einen eigenen Zähler, der bei 0 beginnt. Prüfe deshalb die id, bevor du Differenzen bildest.
  • Auswahl des aktiven Paars: Am zuverlässigsten ist RTCTransportStats.selectedCandidatePairId. Die ältere Eigenschaft selected gibt es nur in Firefox und sie ist nicht standardisiert.
  • Kompatibilität: Wird in allen modernen Browsern unterstützt. Je nach Engine kann der Wert kurz nach dem Verbindungsaufbau fehlen, daher mit Standardwert absichern (bytesReceived ?? 0).
  • Leistung: getStats() ist asynchron und nicht kostenlos. Ein Abfrageintervall von etwa 1 Sekunde reicht für Anzeigen völlig aus.