Signatur
Beschreibung
Die schreibgeschützte Eigenschaft ssrc eines RTCRemoteOutboundRtpStreamStats-Objekts (Statistiktyp "remote-outbound-rtp") enthält eine vorzeichenlose 32-Bit-Ganzzahl. Sie identifiziert die Synchronisationsquelle (Synchronization Source, SSRC) des RTP-Stroms, den der entfernte Peer an die lokale Seite sendet. Die Werte stammen aus RTCP-Sender-Reports (SR) des Gegenübers.
Der SSRC-Wert ist vor allem nützlich, um zusammengehörige Statistik-Einträge zu verknüpfen: Ein remote-outbound-rtp-Eintrag beschreibt denselben Medienstrom wie der lokale inbound-rtp-Eintrag mit identischer ssrc. Zusätzlich verweist localId direkt auf diesen Eintrag. So lassen sich die Angaben des Senders (etwa packetsSent, bytesSent, remoteTimestamp) mit den lokal empfangenen Werten (packetsReceived, packetsLost, jitter) vergleichen.
Die SSRC ist innerhalb einer RTP-Sitzung eindeutig. Sie kann sich aber ändern, etwa bei einer Neuverhandlung, bei Kollisionen oder wenn der Sender seinen Strom neu startet. Deshalb solltest du sie nicht als dauerhafte Kennung einer Spur speichern, sondern bei jedem Abruf von getStats() neu auswerten.
Beispiele
SSRC aller entfernten ausgehenden Ströme auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logRemoteOutboundSsrcs = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'remote-outbound-rtp') {
console.log(`${stats.kind}: SSRC ${stats.ssrc}`);
}
});
};
await logRemoteOutboundSsrcs(pc);
Sender- und Empfängerstatistik per SSRC verknüpfen
const compareStreams = async (pc) => {
const report = await pc.getStats();
const inbound = new Map();
const remoteOut = [];
report.forEach((s) => {
if (s.type === 'inbound-rtp') inbound.set(s.ssrc, s);
if (s.type === 'remote-outbound-rtp') remoteOut.push(s);
});
for (const r of remoteOut) {
const local = inbound.get(r.ssrc);
if (!local) continue;
const fehlend = r.packetsSent - local.packetsReceived;
console.log(`SSRC ${r.ssrc}: gesendet ${r.packetsSent}, empfangen ${local.packetsReceived}, Differenz ${fehlend}`);
}
};
await compareStreams(pc);
SSRC-Wechsel eines Empfängers überwachen
let letzteSsrc = null;
const pruefeSsrc = async (receiver) => {
const report = await receiver.getStats();
for (const s of report.values()) {
if (s.type !== 'remote-outbound-rtp') continue;
if (letzteSsrc !== null && s.ssrc !== letzteSsrc) {
console.warn(`SSRC geändert: ${letzteSsrc} → ${s.ssrc}`);
}
letzteSsrc = s.ssrc;
}
};
const [receiver] = pc.getReceivers();
setInterval(() => pruefeSsrc(receiver), 2000);
// Wichtig · Fallstricke
- Erst nach RTCP-Sender-Reports verfügbar:
remote-outbound-rtp-Einträge erscheinen erst, wenn der Gegenüber mindestens einen RTCP-SR geschickt hat. Direkt nach dem Verbindungsaufbau fehlen sie daher oft. - Nicht mit Spur-IDs verwechseln: Die SSRC ist keine
MediaStreamTrack.idund auch keine stabile Kennung. Bei Neuverhandlung, Simulcast oder SSRC-Kollision kann sie sich ändern. - Zahlenbereich: Der Wert ist eine vorzeichenlose 32-Bit-Zahl. Mit bitweisen Operatoren (
|,&) wird er als vorzeichenbehaftet interpretiert und kann negativ werden. Nutze bei Bedarf>>> 0. - Datenschutz: SSRCs stehen auch im SDP (
a=ssrc:) und sind nicht geheim. Beim Protokollieren solltest du sie trotzdem nur zusammen mit Sitzungskontext speichern. - Kompatibilität: Wird von aktuellen Chromium-Browsern, Firefox und Safari unterstützt. Einige ältere Browser liefern
remote-outbound-rtpgar nicht oder unvollständig. Prüfe daher vor dem Zugriff, ob der Eintrag vorhanden ist.