Signatur
Beschreibung
Die Eigenschaft type des Wörterbuchs RTCOutboundRtpStreamStats ist ein schreibgeschützter String mit dem festen Wert "outbound-rtp". Sie stammt aus dem Basis-Wörterbuch RTCStats. Jeder Eintrag in einem RTCStatsReport hat eine type-Eigenschaft, über die sich die Art der Statistik bestimmen lässt.
Ein RTCStatsReport ist eine Map-ähnliche Sammlung und enthält viele verschiedene Statistiktypen, etwa "inbound-rtp", "candidate-pair", "codec" oder "transport". Mit type === "outbound-rtp" filtert man genau die Einträge heraus, die einen gesendeten RTP-Stream beschreiben. Dazu gehören Kennzahlen wie bytesSent, packetsSent, framesEncoded, qualityLimitationReason oder targetBitrate.
Man braucht diese Eigenschaft vor allem für Monitoring-Dashboards, zur Messung der Senderate oder zur Fehlersuche bei schlechter Upload-Qualität. Pro gesendeter Spur (Audio oder Video) und bei Simulcast pro Ebene (rid) gibt es einen eigenen outbound-rtp-Eintrag.
Rückgabewert
"outbound-rtp", ein Wert der Aufzählung RTCStatsType.Beispiele
Ausgehende RTP-Statistiken aus einem Report filtern
const logOutboundStats = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === "outbound-rtp") {
console.log(`${stats.kind}: ${stats.packetsSent} Pakete, ${stats.bytesSent} Bytes gesendet`);
}
});
};
// pc ist eine bestehende, verbundene RTCPeerConnection
await logOutboundStats(pc);
Senderate (kbit/s) für Video periodisch berechnen
let lastBytes = 0;
let lastTimestamp = 0;
const measureBitrate = async (sender) => {
const report = await sender.getStats();
for (const stats of report.values()) {
if (stats.type !== "outbound-rtp") continue;
if (lastTimestamp) {
const bits = (stats.bytesSent - lastBytes) * 8;
const seconds = (stats.timestamp - lastTimestamp) / 1000;
console.log(`Bitrate: ${(bits / seconds / 1000).toFixed(1)} kbit/s`);
}
lastBytes = stats.bytesSent;
lastTimestamp = stats.timestamp;
}
};
const videoSender = pc.getSenders().find((s) => s.track?.kind === "video");
setInterval(() => measureBitrate(videoSender), 1000);
Qualitätsbegrenzung bei Simulcast-Ebenen erkennen
const checkQualityLimits = async (pc) => {
const report = await pc.getStats();
const outbound = [...report.values()].filter(
(s) => s.type === "outbound-rtp" && s.kind === "video"
);
for (const layer of outbound) {
console.log(layer.rid ?? "(ohne rid)", layer.frameWidth, "x", layer.frameHeight, "–", layer.qualityLimitationReason);
}
};
await checkQualityLimits(pc);
// Wichtig · Fallstricke
- Nicht mit
"remote-outbound-rtp"verwechseln: Dieser Typ beschreibt, was die Gegenseite laut RTCP-Sender-Reports gesendet hat (RTCRemoteOutboundRtpStreamStats). Die Gegenseite eurer eigenenoutbound-rtp-Streams ist dagegen"remote-inbound-rtp"(dort stehen z. B.roundTripTimeundpacketsLost). - Die Eigenschaft ist schreibgeschützt und immer vorhanden. Die meisten anderen Felder können dagegen fehlen, etwa bei Audio- im Vergleich zu Videostreams oder je nach Browser. Vor dem Rechnen besser auf
undefinedprüfen. - Ältere Browser (Chrome vor Version 79, frühe Firefox-Versionen) lieferten zum Teil veraltete Felder wie
isRemoteoder den Legacy-Callback vongetStats(). Deshalb immer die Promise-Variante nutzen. - Bei Simulcast gibt es mehrere
outbound-rtp-Einträge pro Spur. Unterscheiden lassen sie sich überridbzw.ssrc. - Einen
outbound-rtp-Eintrag gibt es erst, wenn tatsächlich gesendet wird, also nach erfolgreicher Aushandlung und mit einer aktiven Spur.