Signatur
Beschreibung
Die Eigenschaft localId gehört zu einem Statistik-Objekt vom Typ "remote-outbound-rtp". Ein solches Objekt beschreibt, was die Gegenstelle über ihren ausgehenden RTP-Stream meldet, z. B. gesendete Pakete und Bytes. Diese Daten stammen aus RTCP-Sender-Reports. localId enthält die id des passenden lokalen "inbound-rtp"-Objekts, also die Statistik darüber, wie dieser Stream bei dir ankommt.
Die Verknüpfung gilt in beide Richtungen: RTCInboundRtpStreamStats.remoteId zeigt auf das remote-outbound-rtp-Objekt, und dessen localId zeigt zurück auf das inbound-rtp-Objekt. Über report.get(localId) kommst du direkt an das Gegenstück im selben RTCStatsReport.
Nützlich ist das vor allem für Qualitätsauswertungen. Du kannst die gesendeten Pakete laut Gegenstelle (packetsSent) mit den lokal empfangenen Paketen (packetsReceived) vergleichen. Außerdem lassen sich Zeitstempel und Round-Trip-Werte (roundTripTimeMeasurements, totalRoundTripTime) dem richtigen Empfangsstream zuordnen.
Rückgabewert
id des zugehörigen RTCInboundRtpStreamStats-Eintrags im selben RTCStatsReport. Nur lesbar.Beispiele
Remote-Outbound-Statistik dem lokalen Empfangsstream zuordnen
// pc ist eine bestehende, verbundene RTCPeerConnection
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'remote-outbound-rtp') continue;
const inbound = report.get(stats.localId);
console.log(`Remote ${stats.kind}: ${stats.packetsSent} Pakete gesendet`);
console.log(`Lokal empfangen: ${inbound?.packetsReceived ?? 'unbekannt'}`);
}
Paketverlust aus beiden Perspektiven berechnen
const computeLoss = async (pc) => {
const report = await pc.getStats();
const results = [];
report.forEach((stats) => {
if (stats.type !== 'remote-outbound-rtp') return;
const inbound = report.get(stats.localId);
if (!inbound) return;
const lost = stats.packetsSent - inbound.packetsReceived;
const lossRate = stats.packetsSent > 0 ? lost / stats.packetsSent : 0;
results.push({ kind: stats.kind, ssrc: stats.ssrc, lossRate: (lossRate * 100).toFixed(2) + ' %' });
});
return results;
};
console.table(await computeLoss(pc));
Verknüpfung in beide Richtungen prüfen
const report = await pc.getStats();
report.forEach((inbound) => {
if (inbound.type !== 'inbound-rtp' || !inbound.remoteId) return;
const remote = report.get(inbound.remoteId);
const consistent = remote?.localId === inbound.id;
console.log(`${inbound.id} ↔ ${inbound.remoteId}: ${consistent ? 'konsistent' : 'fehlt/abweichend'}`);
});
// Wichtig · Fallstricke
- Erst nach RTCP-Daten verfügbar:
remote-outbound-rtp-Einträge gibt es erst, wenn der erste RTCP-Sender-Report angekommen ist. Direkt nach dem Verbindungsaufbau fehlen sie oft. Prüfe also immer, ob der Eintrag existiert. - Nur im selben Report gültig: Löse
localIdimmer im selbenRTCStatsReportauf. IDs aus einem älteren Report können in einem späteren fehlen, etwa nach einer Neuverhandlung oder wenn ein Transceiver gestoppt wurde. - ID-Format nicht auswerten: Das Format der ID ist implementierungsabhängig (z. B.
"IT01V…"in Chrome) und kann sich ändern. Behandle den Wert nur als undurchsichtigen Schlüssel. - Werte stammen von der Gegenstelle: Die Zähler im
remote-outbound-rtp-Objekt meldet die Gegenstelle selbst. Sie können gegenüber der lokalen Messung zeitlich verzögert sein. Kurzzeitig negative Verlustwerte sind deshalb normal. - Browser-Kompatibilität: Ältere Browser liefern
remote-outbound-rtpteilweise gar nicht oder ohnelocalId. Hier ist eine Feature-Erkennung sinnvoll, z. B.'localId' in stats.