Signatur
Beschreibung
Die schreibgeschützte Eigenschaft kind des Wörterbuchs RTCInboundRtpStreamStats gibt an, welche Art von Medien ein eingehender RTP-Stream überträgt. Sie hat immer einen dieser beiden Werte: "audio" oder "video". Der Wert stimmt mit MediaStreamTrack.kind des zugehörigen empfangenen Tracks überein.
Die Statistikobjekte bekommt man über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats(). Beide liefern einen RTCStatsReport, eine Map-ähnliche Sammlung vieler unterschiedlicher Statistiktypen. Einträge mit type === "inbound-rtp" sind RTCInboundRtpStreamStats. Mit kind trennt man sie dann nach Audio und Video.
Das ist wichtig, weil viele Kennzahlen nur für eine Medienart Sinn ergeben. Zum Beispiel gibt es framesDecoded, framesPerSecond und frameWidth nur bei Video. audioLevel, concealedSamples und totalSamplesReceived gibt es nur bei Audio. Prüft man vorher kind, kann man eine Überwachungsanzeige oder Telemetrie gezielt nach Medienart aufbauen.
Rückgabewert
"audio", wenn der Stream Audio überträgt, oder "video", wenn er Video überträgt.Beispiele
Eingehende Streams nach Medienart auflisten
// pc ist eine verbundene RTCPeerConnection
const listInboundStreams = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp') {
console.log(`${stats.kind}-Stream, SSRC ${stats.ssrc}: ${stats.packetsReceived} Pakete`);
}
});
};
await listInboundStreams(pc);
Kennzahlen je nach Medienart auswerten
const logQuality = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'inbound-rtp') continue;
if (stats.kind === 'video') {
console.log(`Video: ${stats.frameWidth}x${stats.frameHeight} @ ${stats.framesPerSecond ?? 0} fps`);
} else if (stats.kind === 'audio') {
console.log(`Audio: Pegel ${stats.audioLevel?.toFixed(2)}, verdeckte Samples ${stats.concealedSamples}`);
}
}
};
// Alle 2 Sekunden abfragen
const timer = setInterval(() => logQuality(pc), 2000);
Paketverlust nur für Video über einen Receiver
const videoReceiver = pc.getReceivers().find((r) => r.track.kind === 'video');
const stats = await videoReceiver.getStats();
const inbound = [...stats.values()].find(
(s) => s.type === 'inbound-rtp' && s.kind === 'video'
);
if (inbound) {
const total = inbound.packetsReceived + inbound.packetsLost;
const lossRate = total > 0 ? (inbound.packetsLost / total) * 100 : 0;
console.log(`Video-Paketverlust: ${lossRate.toFixed(1)} %`);
}
// Wichtig · Fallstricke
- Erst nach
typefiltern: Auch andere Statistiktypen haben einkind-Feld, etwaoutbound-rtp,remote-inbound-rtpundcodec. Deshalb zuersttype === "inbound-rtp"prüfen, sonst mischt man eingehende und ausgehende Daten. - Veraltetes
mediaType: Ältere Chrome-Versionen hatten stattdessen das nicht standardisierte FeldmediaType. Wer alte Browser unterstützen muss, kannstats.kind ?? stats.mediaTypeverwenden. - Stream noch nicht bereit: Ein
inbound-rtp-Eintrag erscheint erst, wenn für diese SSRC tatsächlich RTP-Pakete angekommen sind. Direkt nach dem Verbindungsaufbau kann er also noch fehlen. - Browser-Unterstützung:
kindwird in allen aktuellen Browsern unterstützt. Welche medienspezifischen Kennzahlen es zusätzlich gibt, unterscheidet sich aber zwischen Chrome, Firefox und Safari. Einzelne Felder deshalb immer mit optionaler Verkettung (?.) oder??abfragen.