Signatur
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
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);
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);
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);
// 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 Eigenschaftselectedgibt 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.