Signatur
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
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}`);
}
});
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);
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);
// 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ätzlichid,midoderrid. - 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 eigenenoutbound-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.