Start · Sprachen · JavaScript · Referenz · RTCRemoteInboundRtpStreamStats

RTCRemoteInboundRtpStreamStats

Schnittstelle

Statistik-Wörterbuch (<code>type: "remote-inbound-rtp"</code>) mit den Werten, die die Gegenstelle über einen von uns gesendeten RTP-Stream meldet, z. B. Paketverlust und Round-Trip-Time.

seit JavaScript WebRTC Statistics (W3C); Chrome 88+, Firefox 69+, Kategorie: webapi

Signatur

interface RTCRemoteInboundRtpStreamStats extends RTCReceivedRtpStreamStats

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

Typ
RTCRemoteInboundRtpStreamStats
Beschreibung
Wird nicht direkt erzeugt. Man findet es als Wert im 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);
audio: RTT 42.3 ms, verloren 3, Jitter 2.1 ms video: RTT 43.0 ms, verloren 17, Jitter 5.8 ms

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();
Ø RTT: 45 ms Ø RTT: 51 ms

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);
SSRC 1234567890: Verlust 7.8 % maxBitrate reduziert auf 2000000