Signatur
Beschreibung
Die schreibgeschützte Eigenschaft jitter eines RTCRemoteInboundRtpStreamStats-Objekts (Statistiktyp "remote-inbound-rtp") gibt an, wie stark die Ankunftszeiten der RTP-Pakete beim entfernten Endpunkt schwanken. Der Wert ist in Sekunden angegeben. Er stammt nicht aus einer lokalen Messung, sondern aus dem Feld „interarrival jitter“ der RTCP-Receiver-Reports, die die Gegenseite für den von Ihnen gesendeten Stream zurückschickt.
Damit eignet sich jitter gut, um aus Sicht des Senders die Netzqualität auf dem Hinweg zu beurteilen, etwa für Qualitätsanzeigen, zur Diagnose von Aussetzern oder um die Bitrate adaptiv zu senken. Ein dauerhaft hoher Jitter zeigt eine überlastete oder instabile Verbindung an. Der Empfänger muss das dann mit einem größeren Jitter-Buffer ausgleichen, wodurch die Latenz steigt.
Sie erhalten den Wert über RTCPeerConnection.getStats() oder RTCRtpSender.getStats(). Dazu filtern Sie den zurückgegebenen RTCStatsReport nach Einträgen mit type === "remote-inbound-rtp". Über localId gelangen Sie zum passenden outbound-rtp-Eintrag.
Die Eigenschaft wird von RTCReceivedRtpStreamStats geerbt. Das lokale Gegenstück ist RTCInboundRtpStreamStats.jitter: Dort misst Ihr eigener Browser den Jitter der Pakete, die er empfängt.
Rückgabewert
0.0042 für 4,2 ms. Er ist undefined, solange noch kein RTCP-Receiver-Report der Gegenseite eingegangen ist.Beispiele
Entfernten Jitter aller gesendeten Streams auslesen
// pc ist eine bereits verbundene RTCPeerConnection
const logRemoteJitter = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'remote-inbound-rtp' && stats.jitter !== undefined) {
const ms = (stats.jitter * 1000).toFixed(1);
console.log(`${stats.kind} (SSRC ${stats.ssrc}): Jitter ${ms} ms`);
}
});
};
await logRemoteJitter(pc);
Jitter nur für einen bestimmten Sender abfragen
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const getVideoJitter = async () => {
const report = await videoSender.getStats();
for (const stats of report.values()) {
if (stats.type === 'remote-inbound-rtp') return stats.jitter;
}
return undefined;
};
const jitter = await getVideoJitter();
console.log(jitter !== undefined ? `${jitter * 1000} ms` : 'Noch kein RTCP-Report');
Qualitätsampel mit periodischer Überwachung
const rateJitter = (seconds) => {
if (seconds < 0.02) return 'gut';
if (seconds < 0.05) return 'mittel';
return 'schlecht';
};
const intervalId = setInterval(async () => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'remote-inbound-rtp' || stats.jitter === undefined) continue;
const quality = rateJitter(stats.jitter);
console.log(`${stats.kind}: ${quality}`);
if (quality === 'schlecht' && stats.kind === 'video') {
// z. B. Bitrate reduzieren
const sender = pc.getSenders().find((s) => s.track?.kind === 'video');
const params = sender.getParameters();
if (params.encodings?.[0]) {
params.encodings[0].maxBitrate = 500_000;
await sender.setParameters(params);
}
}
}
}, 2000);
// Beim Auflegen aufräumen
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'closed') clearInterval(intervalId);
});
// Wichtig · Fallstricke
- Einheit Sekunden: Der Wert wird in Sekunden angegeben, nicht in Millisekunden und nicht in RTP-Zeitstempeleinheiten. Für die Anzeige also mit 1000 multiplizieren.
- Verzögert und grob gerastert: Die Daten stammen aus RTCP-Receiver-Reports, die die Gegenseite typischerweise nur alle paar Sekunden schickt. Direkt nach dem Verbindungsaufbau kann der Eintrag fehlen oder
jitteristundefined. Prüfen Sie den Wert deshalb immer, bevor Sie ihn verwenden. - Nicht verwechseln:
remote-inbound-rtpbeschreibt Ihren gesendeten Stream aus Sicht der Gegenseite. Den Jitter Ihres empfangenen Streams finden Sie ininbound-rtp. - Glättung: Der Wert ist nach RFC 3550 geglättet (gleitender Mittelwert). Kurze Spitzen sind daher nicht sofort sichtbar.
- Kompatibilität: Alle modernen Browser unterstützen die Eigenschaft. Ältere Versionen, etwa Safari vor 14.1 oder Chrome vor 80, liefern keinen
remote-inbound-rtp-Eintrag. Über SFUs und Media-Server hängt die Aussagekraft davon ab, welche RTCP-Reports der Server weiterreicht oder selbst erzeugt.