Signatur
Beschreibung
Die Eigenschaft type eines RTCRemoteOutboundRtpStreamStats-Objekts hat immer den Wert "remote-outbound-rtp". Ein solcher Eintrag beschreibt einen RTP-Stream, den die Gegenseite sendet und der lokal empfangen wird. Die Werte stammen aus den RTCP-Sender-Reports (SR), die die Gegenstelle schickt. Aus Sicht des Remote-Peers ist das ein ausgehender Stream.
Gibt man RTCPeerConnection.getStats(), RTCRtpReceiver.getStats() oder RTCRtpSender.getStats() auf, erhält man einen RTCStatsReport. Das ist eine Map-ähnliche Sammlung aus Statistikobjekten ganz unterschiedlicher Art. Über type findet man die gewünschten Einträge und kann danach typsicher auf die passenden Felder zugreifen, zum Beispiel remoteTimestamp, reportsSent, roundTripTimeMeasurements, packetsSent oder bytesSent.
Jeder remote-outbound-rtp-Eintrag verweist über localId auf den passenden inbound-rtp-Eintrag. So lassen sich lokal empfangene Pakete mit den Paketen vergleichen, die laut Gegenseite verschickt wurden. Auf diese Weise erkennt man zum Beispiel Paketverluste oder berechnet die Round-Trip-Time aus Sicht des Senders.
Rückgabewert
"remote-outbound-rtp" (ein Wert des Enums RTCStatsType).Beispiele
Remote-Outbound-Statistiken aus dem Bericht filtern
const logRemoteOutbound = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === "remote-outbound-rtp") {
console.log(`${stats.kind}: ${stats.packetsSent} Pakete, ${stats.bytesSent} Bytes laut Gegenseite gesendet`);
}
});
};
// pc ist eine bestehende, verbundene RTCPeerConnection
await logRemoteOutbound(pc);
Paketverlust per localId mit inbound-rtp abgleichen
const estimateLoss = async (pc) => {
const report = await pc.getStats();
const result = [];
for (const stats of report.values()) {
if (stats.type !== "remote-outbound-rtp") continue;
const inbound = report.get(stats.localId); // zugehöriger inbound-rtp-Eintrag
if (!inbound) continue;
const lost = stats.packetsSent - inbound.packetsReceived;
result.push({ kind: stats.kind, lost, ratio: (lost / stats.packetsSent).toFixed(3) });
}
return result;
};
console.table(await estimateLoss(pc));
Nur für einen bestimmten Empfänger abfragen
const [receiver] = pc.getReceivers();
const report = await receiver.getStats();
const remoteOut = [...report.values()].find((s) => s.type === "remote-outbound-rtp");
if (remoteOut) {
console.log("Typ:", remoteOut.type);
console.log("Sender-Reports erhalten:", remoteOut.reportsSent);
} else {
console.log("Noch kein RTCP-Sender-Report empfangen");
}
// Wichtig · Fallstricke
- Verzögert verfügbar: Ein
remote-outbound-rtp-Eintrag erscheint erst, wenn der erste RTCP-Sender-Report der Gegenseite angekommen ist. Direkt nach dem Verbindungsaufbau kann er noch fehlen. Prüfe deshalb immer, ob er vorhanden ist. - Nicht verwechseln:
"remote-outbound-rtp"(die Gegenseite sendet, du empfängst) ist nicht dasselbe wie"remote-inbound-rtp"(die Gegenseite empfängt deinen Stream) und auch nicht dasselbe wie die lokalen Typen"inbound-rtp"und"outbound-rtp". - Zeitstempel:
remoteTimestampbezieht sich auf die Uhr der Gegenseite.timestampbezieht sich dagegen auf die lokale Uhr. Die beiden Werte darf man nicht direkt miteinander vergleichen. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Ältere Chrome-Versionen vor 88 liefern diesen Typ nicht. Das veraltete, callback-basierte
getStats()kennt ihn ebenfalls nicht. Verwende deshalb immer die Promise-Variante. - Die Eigenschaft ist nur lesbar. Der Wert wird immer mit
===gegen den String verglichen. Einen Konstruktor oder eine globale Konstante dafür gibt es nicht.