Signatur
Beschreibung
Die Eigenschaft packetsReceived eines RTCInboundRtpStreamStats-Objekts enthält einen fortlaufenden Zähler: die Gesamtzahl der RTP-Pakete, die seit Beginn der Verbindung von der Synchronisationsquelle (SSRC) dieses Streams empfangen wurden. Erneut übertragene Pakete (Retransmissions) werden mitgezählt. Die Eigenschaft wird eigentlich in RTCReceivedRtpStreamStats definiert und von RTCInboundRtpStreamStats geerbt.
Du erhältst den Wert, indem du RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() aufrufst und im zurückgegebenen RTCStatsReport nach Einträgen mit type === "inbound-rtp" filterst. Für jede empfangene Audio- bzw. Videospur gibt es einen eigenen Eintrag.
Typische Einsatzzwecke sind Verbindungsqualitäts-Anzeigen, Paketverlust-Berechnungen (zusammen mit packetsLost) und Paketraten-Messungen. Da der Wert kumulativ ist, bildest du für aussagekräftige Raten immer die Differenz zweier Messungen und teilst sie durch die Zeitdifferenz der jeweiligen timestamp-Werte.
Rückgabewert
unsigned long long) mit der Gesamtzahl empfangener RTP-Pakete für diese SSRC.Beispiele
Empfangene Pakete aller eingehenden Streams ausgeben
// pc ist eine bestehende, verbundene RTCPeerConnection
const logInboundPackets = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp') {
console.log(`${stats.kind} (SSRC ${stats.ssrc}): ${stats.packetsReceived} Pakete`);
}
});
};
await logInboundPackets(pc);
Paketverlustrate eines Empfängers berechnen
const getLossRate = async (receiver) => {
const report = await receiver.getStats();
for (const stats of report.values()) {
if (stats.type === 'inbound-rtp') {
const lost = stats.packetsLost ?? 0;
const total = stats.packetsReceived + lost;
return total > 0 ? (lost / total) * 100 : 0;
}
}
return null;
};
const [videoReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'video');
const rate = await getLossRate(videoReceiver);
console.log(`Paketverlust: ${rate.toFixed(2)} %`);
Paketrate pro Sekunde periodisch messen
const previous = new Map();
const measurePacketRate = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'inbound-rtp') return;
const prev = previous.get(stats.id);
if (prev) {
const seconds = (stats.timestamp - prev.timestamp) / 1000;
const pps = (stats.packetsReceived - prev.packetsReceived) / seconds;
console.log(`${stats.kind}: ${pps.toFixed(1)} Pakete/s`);
}
previous.set(stats.id, { timestamp: stats.timestamp, packetsReceived: stats.packetsReceived });
});
};
const timer = setInterval(() => measurePacketRate(pc), 1000);
// Später beenden: clearInterval(timer);
// Wichtig · Fallstricke
- Kumulativer Zähler: Der Wert wächst nur an. Für Raten immer Differenzen zwischen zwei Berichten bilden und durch die Differenz von
timestamp(in Millisekunden) teilen. - Retransmissions: Erneut übertragene Pakete sind enthalten. Wer sie getrennt betrachten will, nutzt zusätzlich
retransmittedPacketsReceived(nicht in allen Browsern verfügbar). - Nicht mit dem Verlust verrechnet:
packetsReceivedsagt allein nichts über die Qualität aus. Für die VerlustratepacketsLostheranziehen; beachte, dasspacketsLostdurch Duplikate auch negativ werden kann. - Stream-Identität: Ändert sich die SSRC (z. B. nach Neuverhandlung oder Simulcast-Umschaltung), entsteht ein neuer Statistik-Eintrag mit neuer
id— der Zähler beginnt dann wieder bei 0. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Ältere Implementierungen lieferten Einträge mit abweichendem
type(z. B."ssrc"in altem Chrome); Code sollte fehlende Felder defensiv behandeln.