Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.ssrc

RTCOutboundRtpStreamStats.ssrc

Eigenschaft

Enthält die 32-Bit-Kennung der Synchronisationsquelle (SSRC), die den ausgehenden RTP-Paketstrom dieses Statistik-Eintrags eindeutig bezeichnet.

seit JavaScript Baseline: alle modernen Browser (Chrome, Edge, Fir Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.ssrc

Beschreibung

Die schreibgeschützte Eigenschaft ssrc eines RTCOutboundRtpStreamStats-Objekts (Statistik-Typ "outbound-rtp") liefert eine vorzeichenlose 32-Bit-Ganzzahl. Sie steht im RTP-Header jedes gesendeten Pakets und identifiziert die Synchronization Source, also den konkreten Medienstrom, den der lokale Teilnehmer an die Gegenstelle schickt.

Innerhalb einer RTP-Sitzung ist die SSRC eindeutig. Deshalb eignet sie sich gut, um Statistik-Einträge einander zuzuordnen: Der "remote-inbound-rtp"-Bericht der Gegenstelle zum selben Strom hat dieselbe ssrc. Außerdem lassen sich damit Werte aus mehreren getStats()-Aufrufen verknüpfen, zum Beispiel um Bitraten aus bytesSent zu berechnen. Beim Simulcast hat jede Schicht (rid) einen eigenen outbound-rtp-Eintrag mit einer eigenen SSRC.

Den Wert bekommst du über RTCPeerConnection.getStats() oder RTCRtpSender.getStats(). Beide liefern einen RTCStatsReport, eine Map-artige Sammlung, die du nach type === "outbound-rtp" filterst.

Rückgabewert

Typ
number
Beschreibung
Eine positive Ganzzahl im Bereich 0 bis 232−1, also der SSRC-Wert des ausgehenden RTP-Stroms.

Beispiele

SSRCs aller ausgehenden Ströme auflisten

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
stream.getTracks().forEach((track) => pc.addTrack(track, stream));

// Verbindungsaufbau (Offer/Answer) wird hier vorausgesetzt
const report = await pc.getStats();
report.forEach((stats) => {
  if (stats.type === 'outbound-rtp') {
    console.log(`${stats.kind}: SSRC ${stats.ssrc}`);
  }
});
audio: SSRC 1843275619 video: SSRC 3029481772

Senderate pro SSRC berechnen

const lastBytes = new Map(); // ssrc -> { bytes, timestamp }

const logBitrates = async (pc) => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'outbound-rtp') continue;
    const prev = lastBytes.get(stats.ssrc);
    if (prev) {
      const kbps = ((stats.bytesSent - prev.bytes) * 8) / (stats.timestamp - prev.timestamp);
      console.log(`SSRC ${stats.ssrc}: ${kbps.toFixed(1)} kbit/s`);
    }
    lastBytes.set(stats.ssrc, { bytes: stats.bytesSent, timestamp: stats.timestamp });
  }
};

setInterval(() => logBitrates(pc), 1000);
SSRC 3029481772: 1245.3 kbit/s

Ausgehenden Strom mit dem Remote-Bericht verknüpfen

const [sender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const report = await sender.getStats();

const outbound = [...report.values()].find((s) => s.type === 'outbound-rtp');
const remoteIn = [...report.values()].find(
  (s) => s.type === 'remote-inbound-rtp' && s.ssrc === outbound.ssrc
);

console.log('SSRC:', outbound.ssrc);
console.log('Verlorene Pakete (Gegenstelle):', remoteIn?.packetsLost);
console.log('RTT (s):', remoteIn?.roundTripTime);
SSRC: 3029481772 Verlorene Pakete (Gegenstelle): 4 RTT (s): 0.042

// Wichtig · Fallstricke

  • Nicht dauerhaft gleich: Die SSRC kann sich während einer Sitzung ändern, etwa bei Kollisionen, nach einer Neuverhandlung oder wenn replaceTrack() bzw. Codec-Wechsel intern einen neuen Strom erzeugen. Verlass dich bei langlebigen Zuordnungen deshalb nicht allein auf die SSRC, sondern prüfe zusätzlich id, mid oder rid.
  • Keine Identität des Tracks: Die SSRC gehört zum RTP-Strom, nicht zum MediaStreamTrack. Bei Simulcast gehören mehrere SSRCs zu einem einzigen Track. Auch Retransmissions (RTX) und FEC laufen über eigene SSRCs, die aber keinen eigenen outbound-rtp-Eintrag haben.
  • Zeitpunkt: Vor dem Aufbau der Verbindung bzw. bevor Pakete gesendet werden, fehlen outbound-rtp-Einträge im Bericht oft ganz.
  • Datenschutz: SSRCs sind zufällig gewählt und geben keine persönlichen Daten preis. Sie können aber Sitzungen in Logs miteinander verknüpfen. Wenn du Statistiken an einen Server überträgst, solltest du das berücksichtigen.
  • Kompatibilität: Wird in allen aktuellen Browsern unterstützt. Ältere Chrome-Versionen haben die veraltete, callback-basierte getStats()-Variante mit anderen Feldnamen genutzt. Verwende immer die Promise-Variante.