Start · Sprachen · JavaScript · Referenz · RTCTransportStats.bytesReceived

RTCTransportStats.bytesReceived

Eigenschaft

Gibt die Gesamtzahl der Payload-Bytes an, die über diesen Transportweg (<code>RTCIceTransport</code>/<code>RTCDtlsTransport</code>) empfangen wurden.

seit JavaScript WebRTC Statistics API – Chromium- und Safari-Brows Kategorie: webapi

Signatur

RTCTransportStats.bytesReceived

Beschreibung

Die Eigenschaft bytesReceived eines RTCTransportStats-Objekts enthält die Gesamtzahl der Payload-Bytes, die eine RTCPeerConnection seit dem Aufbau über einen bestimmten Transportweg empfangen hat. Der Wert zählt nur die Nutzdaten. Header, Padding und ICE-Verbindungsprüfungen (STUN) gehören nicht dazu.

Einträge vom Typ RTCTransportStats bekommst du über RTCPeerConnection.getStats(). Im zurückgegebenen RTCStatsReport haben sie type === "transport". Beim Bündeln aller Medien über einen Transport (Standard mit bundlePolicy: "max-bundle") gibt es in der Regel genau einen solchen Eintrag. Er fasst dann Audio, Video und Datenkanäle zusammen.

Der Wert ist ein Zähler, der nur wächst. Für Kennzahlen wie die aktuelle Empfangsbitrate liest du ihn in regelmäßigen Abständen aus. Dann teilst du die Differenz zweier Messungen durch die Differenz ihrer timestamp-Werte. So lassen sich Bandbreiten-Anzeigen, Verbindungsdiagnosen und Qualitätsüberwachung umsetzen.

Rückgabewert

Typ
number
Beschreibung
Eine nicht-negative Ganzzahl (unsigned long long): die Gesamtzahl der auf diesem Transport empfangenen Payload-Bytes. Kann undefined sein, wenn der Browser den Wert nicht liefert.

Beispiele

Empfangene Bytes des Transports auslesen

// pc ist eine aufgebaute RTCPeerConnection
const logTransportBytes = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'transport') {
      console.log(`Transport ${stats.id}: ${stats.bytesReceived} Bytes empfangen`);
    }
  });
};

await logTransportBytes(pc);
Transport T01: 1843720 Bytes empfangen

Empfangsbitrate periodisch berechnen

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

  const timer = setInterval(async () => {
    const report = await pc.getStats();
    const transport = [...report.values()].find((s) => s.type === 'transport');
    if (!transport || transport.bytesReceived === undefined) return;

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

  // Funktion zum Stoppen zurückgeben
  return () => clearInterval(timer);
};

const stop = monitorBitrate(pc);
// später: stop();
Empfang: 1245.3 kbit/s Empfang: 1310.8 kbit/s

Gesendete und empfangene Bytes gegenüberstellen

const getTrafficSummary = async (pc) => {
  const report = await pc.getStats();
  const t = [...report.values()].find((s) => s.type === 'transport');
  if (!t) return null;

  const toMB = (b) => (b / 1024 / 1024).toFixed(2);
  return {
    empfangenMB: toMB(t.bytesReceived ?? 0),
    gesendetMB: toMB(t.bytesSent ?? 0),
    dtlsState: t.dtlsState
  };
};

console.log(await getTrafficSummary(pc));
{ empfangenMB: '12.47', gesendetMB: '9.83', dtlsState: 'connected' }

// Wichtig · Fallstricke

  • Nur Payload: Header, Padding und STUN-Pakete zählen nicht mit. Der Wert ist deshalb kleiner als der tatsächliche Netzwerkverkehr. Für eine Messung auf Paketebene eignet sich RTCIceCandidatePairStats.bytesReceived des aktiven Kandidatenpaars besser.
  • Kumulativer Zähler: Für Raten brauchst du immer zwei Messungen und die Differenz ihrer timestamp-Werte. Ein einzelner Wert sagt nichts über die aktuelle Bandbreite aus.
  • Kompatibilität: Einträge vom Typ "transport" werden von Chromium-Browsern und Safari geliefert. Firefox stellt sie nur eingeschränkt oder gar nicht bereit. Prüfe vor dem Rechnen auf undefined und greife notfalls auf candidate-pair- oder inbound-rtp-Statistiken zurück.
  • Mehrere Transporte: Ohne Bundling (bundlePolicy ungleich "max-bundle") kann es mehrere Transport-Einträge geben. Summiere sie dann oder ordne sie über id und transportId zu.
  • Performance: getStats() ist asynchron und nicht kostenlos. Intervalle unter etwa 500 ms bringen selten Mehrwert.