Start · Sprachen · JavaScript · Referenz · RTCIceCandidatePairStats.availableIncomingBitrate

RTCIceCandidatePairStats.availableIncomingBitrate

Eigenschaft

Die geschätzte verfügbare eingehende Bandbreite (in Bit/s) der Netzwerkverbindung, die durch ein ICE-Kandidatenpaar dargestellt wird.

seit JavaScript WebRTC Statistics (W3C); Browser-Unterstützung ein Kategorie: webapi

Signatur

RTCIceCandidatePairStats.availableIncomingBitrate

Beschreibung

Die Eigenschaft availableIncomingBitrate gehört zu einem Statistikeintrag vom Typ "candidate-pair", den du über RTCPeerConnection.getStats() erhältst. Sie enthält eine Schätzung der verfügbaren Empfangsbandbreite in Bit pro Sekunde für alle eingehenden RTP-Streams, die über dieses Kandidatenpaar laufen.

Den Wert berechnet die Staukontrolle (Congestion Control) des Browsers. Die Overheads von IP und der Transportschicht (UDP bzw. TCP) sind nicht enthalten. Der Wert entspricht also etwa dem Wert „TIAS“ (Transport Independent Application Specific Maximum) aus RFC 3890. Mehr Bandbreite als geschätzt ist nicht unbedingt verfügbar: Der Wert ist eine Momentaufnahme und kann schwanken.

Nützlich ist die Eigenschaft für Verbindungsqualitäts-Anzeigen, für die Diagnose und dafür, zu entscheiden, welche Simulcast- oder SVC-Schicht ein Server (SFU) senden soll. Aussagekräftig ist sie nur beim aktiv genutzten Kandidatenpaar. Dieses findest du über RTCTransportStats.selectedCandidatePairId oder über die Kombination aus nominated und state === "succeeded".

Rückgabewert

Typ
number | undefined
Beschreibung
Die geschätzte verfügbare eingehende Bitrate in Bit pro Sekunde (ohne IP-/UDP-/TCP-Overhead). undefined, wenn keine Schätzung vorliegt oder der Browser die Eigenschaft nicht unterstützt.

Beispiele

Eingehende Bandbreite des aktiven Kandidatenpaars auslesen

const getIncomingBitrate = async (pc) => {
  const stats = await pc.getStats();
  let pair;

  // Aktives Paar über den Transport-Eintrag ermitteln
  stats.forEach((report) => {
    if (report.type === 'transport' && report.selectedCandidatePairId) {
      pair = stats.get(report.selectedCandidatePairId);
    }
  });

  // Rückfall: nominiertes, erfolgreiches Paar
  if (!pair) {
    stats.forEach((report) => {
      if (report.type === 'candidate-pair' && report.nominated && report.state === 'succeeded') {
        pair = report;
      }
    });
  }

  return pair?.availableIncomingBitrate;
};

const bitrate = await getIncomingBitrate(peerConnection);
console.log(bitrate !== undefined
  ? `Verfügbar eingehend: ${(bitrate / 1000).toFixed(0)} kbit/s`
  : 'Keine Schätzung verfügbar');
Verfügbar eingehend: 2480 kbit/s

Qualitätsanzeige mit regelmäßigem Abfragen

const qualityLabel = (bps) => {
  if (bps === undefined) return 'unbekannt';
  if (bps > 2_500_000) return 'sehr gut';
  if (bps > 800_000) return 'gut';
  if (bps > 300_000) return 'mäßig';
  return 'schlecht';
};

const timer = setInterval(async () => {
  const stats = await peerConnection.getStats();
  for (const report of stats.values()) {
    if (report.type === 'candidate-pair' && report.nominated && report.state === 'succeeded') {
      console.log('Empfangsqualität:', qualityLabel(report.availableIncomingBitrate));
    }
  }
}, 2000);

// Beim Beenden des Anrufs aufräumen
peerConnection.addEventListener('connectionstatechange', () => {
  if (peerConnection.connectionState === 'closed') clearInterval(timer);
});
Empfangsqualität: gut

Eingehende und ausgehende Schätzung vergleichen

const stats = await peerConnection.getStats();
const pairs = [...stats.values()].filter((r) => r.type === 'candidate-pair' && r.nominated);

for (const p of pairs) {
  console.table({
    id: p.id,
    eingehend: p.availableIncomingBitrate ?? 'n/a',
    ausgehend: p.availableOutgoingBitrate ?? 'n/a',
    rtt: p.currentRoundTripTime
  });
}
┌───────────┬──────────────┐ │ id │ 'CPabc123' │ │ eingehend │ 'n/a' │ │ ausgehend │ 1843200 │ │ rtt │ 0.034 │ └───────────┴──────────────┘

// Wichtig · Fallstricke

  • Eingeschränkte Unterstützung: Viele Browser, darunter Chromium-basierte, melden zwar availableOutgoingBitrate, aber nicht availableIncomingBitrate. Ob die Eigenschaft befüllt wird, hängt vom verwendeten Verfahren zur Bandbreitenschätzung ab: Bei senderseitiger Schätzung (Transport-CC) kennt der Empfänger oft keinen eigenen Wert. Prüfe deshalb immer auf undefined und zeige einen sinnvollen Ersatzwert an.
  • Die Einheit ist Bit/s, nicht Byte/s. Für die Anzeige durch 1000 (kbit/s) oder 1 000 000 (Mbit/s) teilen.
  • Auf nicht ausgewählten oder fehlgeschlagenen Kandidatenpaaren ist der Wert meist nicht vorhanden oder nicht aussagekräftig. Wähle das aktive Paar also gezielt aus.
  • Die Schätzung schwankt und reagiert verzögert auf Änderungen im Netz. Für Entscheidungen, etwa den Wechsel der Auflösung, glätte die Werte über mehrere Messungen, z. B. mit einem gleitenden Mittelwert.
  • getStats() ist nicht kostenlos. Frage in Intervallen von etwa 1–5 Sekunden ab, nicht in jedem Frame.