Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.kind

RTCInboundRtpStreamStats.kind

Eigenschaft

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

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

Signatur

RTCInboundRtpStreamStats.kind

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

Typ
"audio" | "video"
Beschreibung
Ein String: "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);
audio-Stream, SSRC 1234567: 5120 Pakete video-Stream, SSRC 7654321: 18342 Pakete

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);
Video: 1280x720 @ 30 fps Audio: Pegel 0.12, verdeckte Samples 480

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)} %`);
}
Video-Paketverlust: 0.8 %

// Wichtig · Fallstricke

  • Erst nach type filtern: Auch andere Statistiktypen haben ein kind-Feld, etwa outbound-rtp, remote-inbound-rtp und codec. Deshalb zuerst type === "inbound-rtp" prüfen, sonst mischt man eingehende und ausgehende Daten.
  • Veraltetes mediaType: Ältere Chrome-Versionen hatten stattdessen das nicht standardisierte Feld mediaType. Wer alte Browser unterstützen muss, kann stats.kind ?? stats.mediaType verwenden.
  • 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: kind wird 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.