Signatur
Beschreibung
Die Eigenschaft kind des Wörterbuchs RTCOutboundRtpStreamStats gibt an, welche Art von Medien ein ausgehender RTP-Stream überträgt. Der Wert ist entweder "audio" oder "video" und entspricht dem kind des zugehörigen MediaStreamTrack.
Die Statistikobjekte bekommt man über RTCPeerConnection.getStats() oder RTCRtpSender.getStats(). Beide liefern einen RTCStatsReport. Das ist eine Map-ähnliche Sammlung, die Statistiken vieler verschiedener Typen enthält. Einträge mit type === "outbound-rtp" beschreiben gesendete Streams. Mit kind trennt man sie nach Audio und Video, etwa um Bildrate und Auflösung nur für Video auszuwerten oder um Audio- und Videobitrate getrennt zu überwachen.
Welche Felder vorhanden sind, hängt von der Medienart ab. Zum Beispiel gibt es framesPerSecond, frameWidth und qualityLimitationReason nur bei Video-Streams. Bevor man solche Werte ausliest, sollte man deshalb immer kind prüfen.
Rückgabewert
"audio" bei einem Audio-Stream, "video" bei einem Video-Stream. Die Eigenschaft ist schreibgeschützt.Beispiele
Ausgehende Streams nach Medienart auflisten
// pc ist eine verbundene RTCPeerConnection
const listOutbound = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'outbound-rtp') {
console.log(`${stats.kind}: SSRC ${stats.ssrc}, ${stats.bytesSent} Bytes gesendet`);
}
});
};
listOutbound(pc);
Video-Sendequalität überwachen
const monitorVideo = (pc) => setInterval(async () => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'outbound-rtp' && stats.kind === 'video') {
console.log(
`${stats.frameWidth}x${stats.frameHeight} @ ${stats.framesPerSecond ?? 0} fps,`,
`Begrenzung: ${stats.qualityLimitationReason ?? 'unbekannt'}`
);
}
}
}, 2000);
const timer = monitorVideo(pc);
// später: clearInterval(timer);
Sendebitrate getrennt nach Audio und Video berechnen
let previous = new Map();
const bitrates = async (pc) => {
const report = await pc.getStats();
const result = { audio: 0, video: 0 };
for (const s of report.values()) {
if (s.type !== 'outbound-rtp') continue;
const prev = previous.get(s.id);
if (prev) {
const bits = (s.bytesSent - prev.bytesSent) * 8;
const sec = (s.timestamp - prev.timestamp) / 1000;
result[s.kind] += Math.round(bits / sec / 1000);
}
previous.set(s.id, s);
}
return result; // kbit/s
};
await bitrates(pc);
setTimeout(async () => console.log(await bitrates(pc)), 1000);
// Wichtig · Fallstricke
- Einträge im
RTCStatsReportsind reine Datenobjekte, keine Live-Objekte. Für aktuelle Werte muss mangetStats()erneut aufrufen. - Veraltet: Ältere Chrome-Versionen hatten stattdessen die Eigenschaft
mediaType. Wer alte Browser unterstützen muss, kann als Rückfallstats.kind ?? stats.mediaTypeverwenden. - Bei Simulcast kann es mehrere
outbound-rtp-Einträge mitkind === "video"geben, einen pro Qualitätsstufe (sieherid). Beim Summieren von Werten muss man das berücksichtigen. kindlegt nicht fest, welche weiteren Felder vorhanden sind. Welche Video-spezifischen Felder es gibt, unterscheidet sich je nach Browser, daher optionale Verkettung (?.) und??verwenden.- Die Statistiken stehen erst zur Verfügung, nachdem die Verbindung ausgehandelt wurde und Medien gesendet werden.