Signatur
Beschreibung
Die schreibgeschützte Eigenschaft jitter eines RTCInboundRtpStreamStats-Objekts (Statistiktyp "inbound-rtp") gibt an, wie stark die Ankunftszeiten der empfangenen RTP-Pakete schwanken. Der Wert ist eine Gleitkommazahl in Sekunden und wird nach dem in RFC 3550, Abschnitt 6.4.1 beschriebenen Verfahren als geglätteter Mittelwert berechnet.
Jitter ist neben Paketverlust (packetsLost) und Umlaufzeit (roundTripTime) eine der wichtigsten Kennzahlen für die Verbindungsqualität bei Audio- und Videoanrufen. Hohe Werte führen dazu, dass der Jitter-Puffer des Empfängers wachsen muss, was die Latenz erhöht, oder dass Pakete zu spät ankommen und verworfen werden – hörbar als Knacksen bzw. sichtbar als Ruckeln.
Man liest den Wert über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() aus, typischerweise periodisch (z. B. jede Sekunde), um Qualitätsanzeigen, Telemetrie oder adaptive Maßnahmen (z. B. Auflösung senken) umzusetzen. Werte unter etwa 30 ms gelten für Sprache meist als unkritisch.
Rückgabewert
0.012 = 12 ms). Kann fehlen (undefined), solange noch keine Pakete empfangen wurden.Beispiele
Jitter aller eingehenden Streams auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logJitter = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp' && stats.jitter !== undefined) {
const ms = (stats.jitter * 1000).toFixed(1);
console.log(`${stats.kind} (SSRC ${stats.ssrc}): Jitter ${ms} ms`);
}
});
};
await logJitter(pc);
Qualitätsanzeige für den Audio-Empfänger
const audioReceiver = pc.getReceivers().find((r) => r.track.kind === 'audio');
const indicator = document.querySelector('#quality');
const intervalId = setInterval(async () => {
const report = await audioReceiver.getStats();
for (const stats of report.values()) {
if (stats.type !== 'inbound-rtp') continue;
const jitterMs = (stats.jitter ?? 0) * 1000;
indicator.textContent =
jitterMs < 30 ? 'Gut' : jitterMs < 60 ? 'Mittel' : 'Schlecht';
}
}, 1000);
// Beim Auflegen aufräumen
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'closed') clearInterval(intervalId);
});
Jitter-Verlauf für Telemetrie sammeln
const samples = [];
const sampleJitter = async (pc) => {
const report = await pc.getStats();
for (const s of report.values()) {
if (s.type === 'inbound-rtp' && s.kind === 'video') {
samples.push({ t: s.timestamp, jitter: s.jitter });
}
}
};
const avgJitterMs = () =>
(samples.reduce((sum, s) => sum + s.jitter, 0) / samples.length) * 1000;
// z. B. nach einigen Messungen:
console.log(`Durchschnitt: ${avgJitterMs().toFixed(1)} ms`);
// Wichtig · Fallstricke
- Einheit Sekunden: Der Wert ist in Sekunden, nicht in Millisekunden oder RTP-Zeitstempel-Einheiten – für Anzeigen mit 1000 multiplizieren.
- Der Wert ist bereits geglättet (gleitender Mittelwert nach RFC 3550). Kurze Spitzen werden dadurch gedämpft; für Puffer-Verhalten sind zusätzlich
jitterBufferDelayundjitterBufferEmittedCountaufschlussreich. - Das Gegenstück aus Sicht des Senders liefert
RTCRemoteInboundRtpStreamStats.jitter(vom Gegenüber per RTCP gemeldet). - Bevor Pakete empfangen wurden, kann die Eigenschaft fehlen – immer auf
undefinedprüfen. - Kompatibilität: In allen aktuellen Browsern verfügbar. Ältere Implementierungen (vor der Spezifikations-Überarbeitung) lieferten teils abweichende Statistiktypen;
getStats()mit Callback-Syntax ist veraltet – die Promise-Variante verwenden. - Performance:
getStats()nicht zu häufig aufrufen (etwa 1× pro Sekunde reicht), da jeder Aufruf einen vollständigen Bericht erzeugt.