Signatur
Beschreibung
Die Eigenschaft ssrc eines RTCRemoteInboundRtpStreamStats-Objekts enthält eine positive 32-Bit-Ganzzahl ohne Vorzeichen. Sie identifiziert die Synchronisationsquelle (SSRC) des RTP-Streams. Der Wert steht im RTP-Header jedes Pakets und unterscheidet die Streams innerhalb einer RTP-Sitzung.
Ein Statistikobjekt vom Typ "remote-inbound-rtp" zeigt, wie die Gegenstelle einen Stream empfängt, den der lokale Peer sendet. Die Daten stammen aus RTCP-Receiver-Reports: verlorene Pakete, Jitter, Round-Trip-Time und Ähnliches. Die ssrc ist deshalb dieselbe wie beim zugehörigen lokalen "outbound-rtp"-Eintrag (RTCOutboundRtpStreamStats).
In der Praxis braucht man ssrc vor allem, um Statistiken einander zuzuordnen, etwa den Sendebericht (outbound) mit dem Empfangsbericht der Gegenseite (remote-inbound). Außerdem kann man damit Streams in Diagnose-Dashboards eindeutig kennzeichnen oder mit SDP-Zeilen wie a=ssrc: abgleichen. Direkter geht die Zuordnung oft über die Eigenschaften localId bzw. remoteId.
Rückgabewert
Beispiele
SSRC aller remote-inbound-Statistiken ausgeben
// pc ist eine verbundene RTCPeerConnection, die Medien sendet
const logRemoteInbound = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'remote-inbound-rtp') {
console.log(`${stats.kind}: SSRC ${stats.ssrc}, Verlust ${stats.packetsLost}`);
}
});
};
await logRemoteInbound(pc);
Outbound- und Remote-Inbound-Statistik über die SSRC zuordnen
const pairBySsrc = async (pc) => {
const report = await pc.getStats();
const outbound = new Map();
const remoteInbound = new Map();
for (const stats of report.values()) {
if (stats.type === 'outbound-rtp') outbound.set(stats.ssrc, stats);
if (stats.type === 'remote-inbound-rtp') remoteInbound.set(stats.ssrc, stats);
}
for (const [ssrc, out] of outbound) {
const remote = remoteInbound.get(ssrc);
if (!remote) continue; // noch kein RTCP-Receiver-Report eingetroffen
const total = out.packetsSent + remote.packetsLost;
const lossRate = total > 0 ? (remote.packetsLost / total) * 100 : 0;
console.log(`SSRC ${ssrc}: ${lossRate.toFixed(2)} % Verlust, RTT ${remote.roundTripTime ?? '?'} s`);
}
};
await pairBySsrc(pc);
SSRC eines bestimmten Senders periodisch überwachen
const [sender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const timer = setInterval(async () => {
const report = await sender.getStats();
for (const stats of report.values()) {
if (stats.type === 'remote-inbound-rtp') {
console.log(`Video-SSRC ${stats.ssrc.toString(16)} (hex), Jitter ${stats.jitter} s`);
}
}
}, 2000);
// später: clearInterval(timer);
// Wichtig · Fallstricke
- Verzögerte Verfügbarkeit:
remote-inbound-rtp-Einträge gibt es erst, wenn der erste RTCP-Receiver-Report der Gegenstelle angekommen ist. Direkt nach dem Verbindungsaufbau fehlen sie oft noch. - Nicht stabil: Die SSRC kann sich ändern, etwa nach einer Neuverhandlung, bei
replaceTrack()in manchen Implementierungen oder bei einer SSRC-Kollision. Speichere sie deshalb nicht dauerhaft als Schlüssel. - Simulcast: Jede Simulcast-Ebene hat eine eigene SSRC. Ein einzelner Sender kann daher mehrere
remote-inbound-rtp-Einträge liefern. - Keine Identität: Die SSRC ist zufällig gewählt und kein Merkmal zur Authentifizierung. Für die Zuordnung innerhalb eines Berichts ist
localIdoft zuverlässiger. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Ältere Chrome-Versionen lieferten SSRCs über die veraltete, callback-basierte
getStats()-API zum Teil als Zeichenkette.