Signatur
Beschreibung
Die schreibgeschützte Eigenschaft headerBytesReceived des Dictionaries RTCInboundRtpStreamStats ist ein kumulativer Zähler. Er enthält die Anzahl aller bisher empfangenen Bytes aus RTP-Headern und RTP-Padding für die Synchronisationsquelle (SSRC) dieses eingehenden Streams. Header-Erweiterungen zählen dazu. Transportschichten wie UDP, IP, TURN oder die SRTP-Authentifizierung sind nicht enthalten.
Zusammen mit bytesReceived ergibt sich das gesamte RTP-Datenvolumen eines Streams. bytesReceived zählt nur die Nutzdaten. Beide Werte addiert zeigen also, wie viele RTP-Bytes wirklich über die Leitung kamen. Damit lässt sich zum Beispiel der Header-Overhead berechnen oder eine genauere Bitrate ermitteln.
Den Wert erhalten Sie über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats(). Im zurückgegebenen RTCStatsReport filtern Sie nach Einträgen mit type === "inbound-rtp". Da der Zähler seit Beginn der Verbindung nur wächst, brauchen Sie für Raten (Bytes pro Sekunde) zwei Messpunkte. Die Differenz der Werte teilen Sie durch die Differenz der timestamp-Werte.
Rückgabewert
unsigned long long): die kumulierte Anzahl empfangener RTP-Header- und Padding-Bytes für diese SSRC. Unterstützt ein Browser die Eigenschaft nicht, ist sie undefined.Beispiele
Header- und Nutzdaten-Bytes aller eingehenden Streams ausgeben
// pc ist eine bestehende, verbundene RTCPeerConnection
const logInboundBytes = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'inbound-rtp') return;
console.log(
`${stats.kind} (SSRC ${stats.ssrc}): ` +
`Header ${stats.headerBytesReceived} B, Nutzdaten ${stats.bytesReceived} B`
);
});
};
await logInboundBytes(pc);
Header-Overhead in Prozent berechnen
const headerOverhead = async (receiver) => {
const report = await receiver.getStats();
for (const stats of report.values()) {
if (stats.type === 'inbound-rtp' && stats.headerBytesReceived !== undefined) {
const total = stats.headerBytesReceived + stats.bytesReceived;
return total === 0 ? 0 : (stats.headerBytesReceived / total) * 100;
}
}
return null; // keine Daten oder Eigenschaft nicht unterstützt
};
const [audioReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'audio');
const pct = await headerOverhead(audioReceiver);
console.log(`Header-Anteil Audio: ${pct?.toFixed(1)} %`);
RTP-Bitrate inklusive Header im Sekundentakt messen
const prev = new Map();
const monitor = setInterval(async () => {
const report = await pc.getStats();
report.forEach((s) => {
if (s.type !== 'inbound-rtp') return;
const bytes = (s.headerBytesReceived ?? 0) + s.bytesReceived;
const last = prev.get(s.id);
if (last) {
const seconds = (s.timestamp - last.timestamp) / 1000;
const kbps = ((bytes - last.bytes) * 8) / seconds / 1000;
console.log(`${s.kind}: ${kbps.toFixed(0)} kbit/s (RTP inkl. Header)`);
}
prev.set(s.id, { bytes, timestamp: s.timestamp });
});
}, 1000);
// Später beenden:
// clearInterval(monitor);
// Wichtig · Fallstricke
- Kumulativer Zähler: Der Wert zählt seit Beginn des Streams hoch. Für Raten brauchen Sie immer zwei Messungen und deren
timestamp-Differenz. Ein einzelner Wert sagt über die aktuelle Bandbreite nichts aus. - Kein Transport-Overhead: IP-, UDP-, DTLS/SRTP- und TURN-Overhead sind nicht enthalten. Für das Volumen auf Transportebene nutzen Sie
RTCTransportStats.bytesReceivedbzw. die Werte descandidate-pair. - Padding zählt mit: Bandbreitenschätzungen fügen oft reines Padding ein (Probing). Das kann den Wert zeitweise stark erhöhen, auch wenn kaum Mediendaten fließen.
- Kompatibilität: Ältere Browser liefern die Eigenschaft nicht. Prüfen Sie daher auf
undefinedoder verwenden Sie?? 0. Die Statistik-Objekte sind reine Daten-Dictionaries ohne eigenen Konstruktor. - Neue SSRC: Wird eine SSRC neu ausgehandelt, etwa bei Renegotiation oder Simulcast-Wechsel, kann ein neuer
inbound-rtp-Eintrag mit eigeneridentstehen. Ordnen Sie Messwerte deshalb immer überstats.idzu.