Start · Sprachen · JavaScript · Referenz · RTCRemoteInboundRtpStreamStats.jitter

RTCRemoteInboundRtpStreamStats.jitter

Eigenschaft

Liefert den Paket-Jitter in Sekunden für die SSRC eines gesendeten RTP-Streams, so wie ihn der entfernte Empfänger gemessen und per RTCP-Receiver-Report gemeldet hat.

seit JavaScript Baseline: Chrome/Edge 80+, Firefox 68+, Safari 14. Kategorie: webapi

Signatur

RTCRemoteInboundRtpStreamStats.jitter

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

Typ
number | undefined
Beschreibung
Der Jitter in Sekunden als Gleitkommazahl, z. B. 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);
audio (SSRC 1234567890): Jitter 3.8 ms video (SSRC 987654321): Jitter 12.4 ms

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');
12.4 ms

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);
});
audio: gut video: mittel

// 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 jitter ist undefined. Prüfen Sie den Wert deshalb immer, bevor Sie ihn verwenden.
  • Nicht verwechseln: remote-inbound-rtp beschreibt Ihren gesendeten Stream aus Sicht der Gegenseite. Den Jitter Ihres empfangenen Streams finden Sie in inbound-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.