Signatur
Beschreibung
Die Eigenschaft packetsReceived des Wörterbuchs RTCTransportStats enthält eine nicht negative Ganzzahl. Sie zählt alle Pakete, die auf dem jeweiligen Transport eingegangen sind. Ein Objekt dieses Typs bekommt man, wenn man in dem RTCStatsReport aus RTCPeerConnection.getStats() nach Einträgen mit type === "transport" filtert.
Gezählt wird auf der Transportebene. Der Wert umfasst also alle Pakete, die über diesen Transport laufen: RTP, RTCP, DTLS und je nach Implementierung auch Daten für RTCDataChannel (SCTP). Er ist damit in der Regel größer als die Summe der packetsReceived-Werte der einzelnen inbound-rtp-Statistiken.
In der Praxis vergleicht man mehrere Momentaufnahmen, um Paketraten zu berechnen oder eine hängende Verbindung zu erkennen. Steigt der Zähler über mehrere Sekunden nicht mehr, obwohl die Verbindung als connected gilt, kommen vermutlich keine Daten an. Zusammen mit bytesReceived lässt sich auch die mittlere Paketgröße bestimmen.
Rückgabewert
unsigned long long) mit der Anzahl der seit Erstellung des Transports empfangenen Pakete. undefined, wenn der Browser das Feld nicht liefert.Beispiele
Empfangene Pakete des Transports auslesen
const logTransportPackets = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'transport') {
console.log(`Transport ${stats.id}: ${stats.packetsReceived ?? 'n/a'} Pakete empfangen`);
}
});
};
// Aufruf mit einer bestehenden, verbundenen RTCPeerConnection
await logTransportPackets(peerConnection);
Paketrate pro Sekunde berechnen
const getTransport = async (pc) => {
const report = await pc.getStats();
return [...report.values()].find((s) => s.type === 'transport');
};
let previous = await getTransport(peerConnection);
const timer = setInterval(async () => {
const current = await getTransport(peerConnection);
if (!current || !previous) return;
// timestamp ist in Millisekunden
const seconds = (current.timestamp - previous.timestamp) / 1000;
const rate = (current.packetsReceived - previous.packetsReceived) / seconds;
console.log(`Empfangsrate: ${rate.toFixed(1)} Pakete/s`);
previous = current;
}, 1000);
// Später beenden: clearInterval(timer);
Stillstand der Verbindung erkennen
const watchForStall = (pc, { intervalMs = 2000, maxIdle = 3 } = {}) => {
let last = null;
let idleCount = 0;
const id = setInterval(async () => {
const report = await pc.getStats();
const transport = [...report.values()].find((s) => s.type === 'transport');
const received = transport?.packetsReceived ?? 0;
idleCount = received === last ? idleCount + 1 : 0;
last = received;
if (idleCount >= maxIdle) {
console.warn('Seit mehreren Messungen keine Pakete empfangen – Verbindung prüfen!');
clearInterval(id);
}
}, intervalMs);
return () => clearInterval(id);
};
const stopWatching = watchForStall(peerConnection);
// Wichtig · Fallstricke
- Kumulativer Zähler: Der Wert zählt seit Erstellung des Transports nur nach oben. Für Raten muss man zwei Momentaufnahmen vergleichen und dabei
timestampberücksichtigen, nicht die Timer-Zeit. - Nicht mit
inbound-rtpverwechseln:RTCInboundRtpStreamStats.packetsReceivedzählt nur die RTP-Pakete eines einzelnen Medienstroms. Der Transport-Zähler enthält zusätzlich RTCP-, DTLS- und SCTP-Verkehr. - Bündelung: Mit
bundlePolicy: "max-bundle"teilen sich alle Streams meist einen einzigen Transport. Ohne Bündelung kann es mehreretransport-Einträge geben, deren Werte man bei Bedarf addieren muss. - Browser-Kompatibilität: Das Feld kam erst später in die Spezifikation und wird nicht überall geliefert. Firefox stellt teilweise keine
transport-Statistiken bereit. Deshalb immer mit?? 0bzw. einer Prüfung aufundefinedabsichern. - Nach
pc.close()liefertgetStats()je nach Browser keine oder eingefrorene Werte mehr.