Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.kind

RTCOutboundRtpStreamStats.kind

Eigenschaft

Ein String (<code>"audio"</code> oder <code>"video"</code>), der angibt, ob der ausgehende RTP-Stream Audio- oder Videodaten überträgt.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (aktuelle Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.kind

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

Typ
string
Beschreibung
"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);
audio: SSRC 12345678, 482113 Bytes gesendet video: SSRC 87654321, 9123344 Bytes gesendet

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);
1280x720 @ 30 fps, Begrenzung: none

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);
{ audio: 32, video: 1450 }

// Wichtig · Fallstricke

  • Einträge im RTCStatsReport sind reine Datenobjekte, keine Live-Objekte. Für aktuelle Werte muss man getStats() erneut aufrufen.
  • Veraltet: Ältere Chrome-Versionen hatten stattdessen die Eigenschaft mediaType. Wer alte Browser unterstützen muss, kann als Rückfall stats.kind ?? stats.mediaType verwenden.
  • Bei Simulcast kann es mehrere outbound-rtp-Einträge mit kind === "video" geben, einen pro Qualitätsstufe (siehe rid). Beim Summieren von Werten muss man das berücksichtigen.
  • kind legt 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.