Start · Sprachen · JavaScript · Referenz · RTCRemoteInboundRtpStreamStats.localId

RTCRemoteInboundRtpStreamStats.localId

Eigenschaft

String-ID, die auf das lokale <code>RTCOutboundRtpStreamStats</code>-Objekt verweist, dessen <code>remoteId</code> auf diesen <code>remote-inbound-rtp</code>-Eintrag zeigt.

seit JavaScript WebRTC Statistics API; Chrome 80+, Firefox 68+, Sa Kategorie: webapi

Signatur

RTCRemoteInboundRtpStreamStats.localId

Beschreibung

Die Eigenschaft localId eines RTCRemoteInboundRtpStreamStats-Objekts (Statistiktyp "remote-inbound-rtp") enthält die id des passenden RTCOutboundRtpStreamStats-Eintrags (Typ "outbound-rtp") im selben RTCStatsReport. Die beiden Einträge beschreiben denselben RTP-Datenstrom aus zwei Sichten: Outbound ist das, was Ihr Browser sendet. Remote-Inbound ist das, was die Gegenstelle per RTCP-Receiver-Reports über den Empfang dieses Datenstroms meldet.

Die Verknüpfung geht in beide Richtungen: outbound.remoteId === remoteInbound.id und remoteInbound.localId === outbound.id. So lassen sich lokale Sendewerte (z. B. bytesSent, packetsSent, framesEncoded) mit den Empfangswerten der Gegenseite (z. B. packetsLost, fractionLost, roundTripTime, jitter) zusammenführen.

Typische Einsatzfälle sind Qualitätsanzeigen in Videokonferenz-Anwendungen, adaptive Bitratensteuerung und Telemetrie. Mit localId und RTCStatsReport.get() brauchen Sie den Bericht nicht nach passenden SSRC-Werten zu durchsuchen, sondern springen direkt zum zugehörigen Eintrag.

Rückgabewert

Typ
string
Beschreibung
Die id des zugehörigen RTCOutboundRtpStreamStats-Eintrags im selben RTCStatsReport. Nutzen Sie sie mit report.get(localId).

Beispiele

Remote-Inbound- und Outbound-Statistik verknüpfen

// pc ist eine verbundene RTCPeerConnection
const report = await pc.getStats();

report.forEach((stat) => {
  if (stat.type !== 'remote-inbound-rtp') return;

  // Direkter Sprung zum lokalen Sende-Eintrag
  const outbound = report.get(stat.localId);
  if (!outbound) return;

  console.log(`${stat.kind}: gesendet ${outbound.packetsSent} Pakete, ` +
    `Gegenseite meldet ${stat.packetsLost} verloren, ` +
    `RTT ${(stat.roundTripTime * 1000).toFixed(0)} ms`);
});
video: gesendet 18234 Pakete, Gegenseite meldet 12 verloren, RTT 48 ms audio: gesendet 9120 Pakete, Gegenseite meldet 3 verloren, RTT 47 ms

Verlustrate pro gesendetem Datenstrom überwachen

const monitorSendQuality = (pc, intervalMs = 2000) => {
  const timer = setInterval(async () => {
    const report = await pc.getStats();

    for (const stat of report.values()) {
      if (stat.type !== 'remote-inbound-rtp') continue;
      const outbound = report.get(stat.localId);
      if (!outbound) continue;

      const lossPercent = (stat.fractionLost ?? 0) * 100;
      if (lossPercent > 5) {
        console.warn(`Hoher Verlust bei ${outbound.kind} (SSRC ${outbound.ssrc}): ` +
          `${lossPercent.toFixed(1)} %`);
      }
    }
  }, intervalMs);

  return () => clearInterval(timer); // Aufräumfunktion
};

const stopMonitoring = monitorSendQuality(pc);
// später: stopMonitoring();
Hoher Verlust bei video (SSRC 3735928559): 7.8 %

Fallback über SSRC, falls localId fehlt

const findOutbound = (report, remoteInbound) => {
  // Bevorzugt: direkte Referenz
  if (remoteInbound.localId && report.has(remoteInbound.localId)) {
    return report.get(remoteInbound.localId);
  }
  // Fallback für ältere Implementierungen: Zuordnung über SSRC und kind
  for (const stat of report.values()) {
    if (stat.type === 'outbound-rtp' &&
        stat.ssrc === remoteInbound.ssrc &&
        stat.kind === remoteInbound.kind) {
      return stat;
    }
  }
  return undefined;
};

const report = await pc.getStats();
const remote = [...report.values()].find((s) => s.type === 'remote-inbound-rtp');
console.log(remote ? findOutbound(report, remote)?.id : 'kein Remote-Report');
OT01V3735928559

// Wichtig · Fallstricke

  • Erst nach RTCP-Reports vorhanden: remote-inbound-rtp-Einträge erscheinen erst, wenn die Gegenstelle RTCP-Receiver-Reports geschickt hat. Direkt nach dem Verbindungsaufbau fehlen sie daher oft.
  • Die IDs haben kein festes Format: Werte wie "OT01V…" sind browserabhängig. Parsen Sie sie nicht, sondern nutzen Sie sie nur zum Nachschlagen mit report.get().
  • Nur im selben Bericht gültig: Die Referenz gilt innerhalb eines RTCStatsReport. Prüfen Sie immer mit report.has() oder optionaler Verkettung (?.), ob der Eintrag existiert, zum Beispiel nach removeTrack() oder einer Neuverhandlung.
  • Browser-Kompatibilität: Chromium-Browser und Firefox unterstützen die Eigenschaft. Safari und ältere Versionen setzen sie teils nicht oder unvollständig. Ein Fallback über ssrc und kind ist daher sinnvoll.
  • Nicht verwechseln: Auch RTCRemoteOutboundRtpStreamStats hat ein localId. Dieses verweist aber auf einen inbound-rtp-Eintrag, nicht auf outbound-rtp.
  • Leistung: Rufen Sie getStats() nicht zu häufig auf. Intervalle von etwa 1–5 Sekunden sind üblich.