Signatur
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
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');
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);
});
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
});
}
// Wichtig · Fallstricke
- Eingeschränkte Unterstützung: Viele Browser, darunter Chromium-basierte, melden zwar
availableOutgoingBitrate, aber nichtavailableIncomingBitrate. 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 aufundefinedund 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.