Signatur
Beschreibung
RTCRemoteInboundRtpStreamStats ist ein Wörterbuch (Dictionary) der WebRTC-Statistik-API. Es beschreibt einen RTP-Stream, den der lokale Endpunkt sendet, und zwar aus Sicht des entfernten Empfängers. Die Werte werden nicht lokal gemessen. Sie stammen aus den RTCP-Empfängerberichten (Receiver Reports), die die Gegenstelle regelmäßig zurückschickt. Daraus erfahren Sie, wie viele Ihrer Pakete tatsächlich ankommen, wie stark der Jitter beim Empfänger ist und wie hoch die Round-Trip-Time (RTT) ist.
Einen Konstruktor gibt es nicht. Die Objekte stecken im RTCStatsReport, den RTCPeerConnection.getStats() oder RTCRtpSender.getStats() liefert, und sind an type === "remote-inbound-rtp" zu erkennen. Jedes Objekt gehört zu genau einem lokalen outbound-rtp-Eintrag. Diese Verbindung stellt die Eigenschaft localId her.
Typische Einsatzzwecke:
- Verbindungsqualität für Nutzer anzeigen (Balken, Ampel)
- Bitrate oder Auflösung senken, wenn Pakete verloren gehen
- Latenz in Video- und Sprachkonferenzen überwachen
- Telemetrie an ein Monitoring-Backend senden
Das Wörterbuch erbt Felder von RTCReceivedRtpStreamStats (packetsLost, jitter), von RTCRtpStreamStats (ssrc, kind, transportId, codecId) und von RTCStats (id, timestamp, type). Eigene Felder sind localId, roundTripTime, totalRoundTripTime, roundTripTimeMeasurements und fractionLost.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $localId | string | ID des zugehörigen lokalen outbound-rtp-Eintrags im selben RTCStatsReport. |
|
| $roundTripTime | number | Zuletzt gemessene Round-Trip-Time in Sekunden, berechnet aus RTCP-Sender- und Empfängerberichten. Fehlt, solange noch kein Bericht eingetroffen ist. | |
| $totalRoundTripTime | number | Summe aller bisherigen RTT-Messungen in Sekunden. Geteilt durch roundTripTimeMeasurements ergibt sich die mittlere RTT. |
|
| $roundTripTimeMeasurements | number | Anzahl der gültigen RTT-Messungen, die in totalRoundTripTime eingeflossen sind. |
|
| $fractionLost | number | Anteil verlorener Pakete (0 bis 1) seit dem vorherigen Empfängerbericht, laut RTCP-Feld fraction lost. | |
| $packetsLost | number | (geerbt) Kumulierte Zahl verlorener Pakete, wie sie der Empfänger meldet. Kann durch Duplikate negativ sein. | |
| $jitter | number | (geerbt) Interarrival-Jitter beim Empfänger in Sekunden. | |
| $ssrc / kind / transportId / codecId | number | string | (geerbt) SSRC des Streams, Medienart ("audio"/"video") und Verweise auf Transport- und Codec-Statistiken. |
|
| $id / timestamp / type Pflicht | string | number | (geerbt) Eindeutige ID, Zeitstempel in Millisekunden (DOMHighResTimeStamp) und der Typ "remote-inbound-rtp". |
Rückgabewert
RTCStatsReport (einer Map-ähnlichen Struktur) von getStats().Beispiele
Alle remote-inbound-rtp-Einträge auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logRemoteInbound = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'remote-inbound-rtp') return;
const rttMs = stats.roundTripTime !== undefined
? (stats.roundTripTime * 1000).toFixed(1)
: 'n/a';
console.log(`${stats.kind}: RTT ${rttMs} ms, verloren ${stats.packetsLost}, Jitter ${(stats.jitter * 1000).toFixed(1)} ms`);
});
};
await logRemoteInbound(pc);
Mittlere RTT pro Intervall aus den Summenwerten berechnen
// Liefert pro Sekunde die durchschnittliche RTT seit der letzten Abfrage
const monitorRtt = (sender, onUpdate) => {
let prev = null;
const timer = setInterval(async () => {
const report = await sender.getStats();
const remote = [...report.values()].find((s) => s.type === 'remote-inbound-rtp');
if (!remote || remote.roundTripTimeMeasurements === undefined) return;
if (prev) {
const count = remote.roundTripTimeMeasurements - prev.roundTripTimeMeasurements;
const sum = remote.totalRoundTripTime - prev.totalRoundTripTime;
if (count > 0) onUpdate(Math.round((sum / count) * 1000));
}
prev = remote;
}, 1000);
return () => clearInterval(timer);
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const stop = monitorRtt(videoSender, (ms) => console.log(`Ø RTT: ${ms} ms`));
// später: stop();
Bitrate bei hohem Paketverlust drosseln (localId-Verknüpfung)
const adaptBitrate = async (pc) => {
const report = await pc.getStats();
for (const remote of report.values()) {
if (remote.type !== 'remote-inbound-rtp' || remote.kind !== 'video') continue;
const outbound = report.get(remote.localId); // zugehöriger outbound-rtp
const lossRatio = remote.fractionLost ?? 0;
console.log(`SSRC ${outbound?.ssrc}: Verlust ${(lossRatio * 100).toFixed(1)} %`);
if (lossRatio > 0.05) {
const sender = pc.getSenders().find((s) => s.track?.kind === 'video');
const params = sender.getParameters();
if (!params.encodings?.length) continue;
const current = params.encodings[0].maxBitrate ?? 2_500_000;
params.encodings[0].maxBitrate = Math.max(300_000, Math.round(current * 0.8));
await sender.setParameters(params);
console.log(`maxBitrate reduziert auf ${params.encodings[0].maxBitrate}`);
}
}
};
setInterval(() => adaptBitrate(pc), 2000);