Signatur
Beschreibung
Die schreibgeschützte Eigenschaft type gehört zum Wörterbuch RTCInboundRtpStreamStats und hat immer den Wert "inbound-rtp". Sie wird von RTCStats geerbt. Jedes Statistikobjekt in einem RTCStatsReport hat so eine Eigenschaft, über die man seine Art erkennt.
Ein Aufruf von RTCPeerConnection.getStats(), RTCRtpReceiver.getStats() oder RTCRtpSender.getStats() liefert einen RTCStatsReport. Das ist eine Map-ähnliche Sammlung mit vielen verschiedenen Statistikobjekten, etwa zu Kandidatenpaaren, Codecs, Transporten sowie ein- und ausgehenden Streams. Wenn Sie nach type === "inbound-rtp" filtern, bleiben nur die Einträge zu empfangenen Audio- und Videodaten übrig. Dazu gehören zum Beispiel packetsLost, jitter, bytesReceived oder framesDecoded.
Typische Anwendungen sind die Überwachung der Verbindungsqualität, die Berechnung der empfangenen Bitrate oder die Erkennung von Paketverlusten in Videokonferenz-Anwendungen. Ob es sich um Audio oder Video handelt, steht nicht in type. Dafür wertet man zusätzlich die Eigenschaft kind aus.
Rückgabewert
"inbound-rtp". Er ist ein Wert der Aufzählung RTCStatsType.Beispiele
Eingehende RTP-Statistiken aus einem Bericht filtern
// pc ist eine bestehende, verbundene RTCPeerConnection
const logInboundStats = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === "inbound-rtp") {
console.log(`${stats.kind}: ${stats.packetsReceived} Pakete, ${stats.packetsLost} verloren`);
}
});
};
logInboundStats(pc);
Empfangene Video-Bitrate periodisch berechnen
let previous = null;
const measureBitrate = async (pc) => {
const report = await pc.getStats();
const video = [...report.values()].find(
(s) => s.type === "inbound-rtp" && s.kind === "video"
);
if (!video) return;
if (previous) {
const bytes = video.bytesReceived - previous.bytesReceived;
const seconds = (video.timestamp - previous.timestamp) / 1000;
const kbps = Math.round((bytes * 8) / seconds / 1000);
console.log(`Video-Bitrate: ${kbps} kbit/s`);
}
previous = video;
};
const timer = setInterval(() => measureBitrate(pc), 1000);
// Später: clearInterval(timer);
Statistiken eines einzelnen Empfängers abfragen
const [receiver] = pc.getReceivers();
const report = await receiver.getStats();
const inbound = [...report.values()].filter((s) => s.type === "inbound-rtp");
console.log(inbound.map((s) => ({ type: s.type, kind: s.kind, jitter: s.jitter })));
// Wichtig · Fallstricke
- Verwechseln Sie
"inbound-rtp"nicht mit"remote-inbound-rtp". Letzteres beschreibt die Statistiken, die die Gegenstelle per RTCP über Ihren gesendeten Stream zurückmeldet (RTCRemoteInboundRtpStreamStats). - Ob Audio oder Video empfangen wird, zeigt
typenicht an. Prüfen Sie dafür immer zusätzlichkind. Die veraltete EigenschaftmediaTypesollten Sie nicht mehr verwenden. - Ein
RTCStatsReportist kein Array, sondern ein Map-ähnliches Objekt. Nutzen SieforEach(),values()oder den Spread-Operator zum Durchlaufen. - Direkt nach dem Verbindungsaufbau gibt es eventuell noch keine
inbound-rtp-Einträge. Solche Einträge erscheinen erst, wenn tatsächlich RTP-Pakete empfangen werden. - Browser-Kompatibilität: Der Typwert wird von allen modernen Browsern unterstützt. Welche Einzelfelder vorhanden sind, unterscheidet sich aber je nach Browser. Prüfen Sie Felder deshalb vor der Verwendung auf
undefined.