Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.codecId

RTCInboundRtpStreamStats.codecId

Eigenschaft

String-ID des <code>RTCCodecStats</code>-Objekts im selben Statistik-Bericht, das den Codec des eingehenden RTP-Streams beschreibt.

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

Signatur

RTCInboundRtpStreamStats.codecId

Beschreibung

Die Eigenschaft codecId eines RTCInboundRtpStreamStats-Eintrags (Typ "inbound-rtp") ist ein String. Er verweist auf ein RTCCodecStats-Objekt (Typ "codec") im selben RTCStatsReport. Dort stehen die Angaben zum Codec, mit dem der empfangene RTP-Stream dekodiert wird, zum Beispiel mimeType ("video/VP8", "audio/opus"), clockRate, channels, payloadType und sdpFmtpLine.

Die Codec-Daten stehen also nicht direkt im Inbound-Eintrag. codecId ist nur ein Fremdschlüssel. Die eigentlichen Werte holst du dir mit report.get(stats.codecId). Das ist nützlich, wenn du prüfen willst, welcher Codec nach der SDP-Aushandlung wirklich benutzt wird, oder wenn du Qualitätswerte wie framesDecoded oder jitter je Codec auswerten willst.

Die ID ist ein vom Browser vergebener, undurchsichtiger Bezeichner. Sie gilt nur innerhalb eines Berichts bzw. einer RTCPeerConnection. Solange noch keine Pakete empfangen wurden oder kein Codec feststeht, fehlt die Eigenschaft (undefined).

Rückgabewert

Typ
string | undefined
Beschreibung
Die id des zugehörigen RTCCodecStats-Objekts im selben RTCStatsReport. undefined, wenn noch kein Codec feststeht.

Beispiele

Codec aller eingehenden Streams ermitteln

// pc ist eine bestehende, verbundene RTCPeerConnection
const logInboundCodecs = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type !== 'inbound-rtp' || !stats.codecId) return;
    const codec = report.get(stats.codecId);
    console.log(`${stats.kind}: ${codec?.mimeType} @ ${codec?.clockRate} Hz`);
  });
};

await logInboundCodecs(pc);
audio: audio/opus @ 48000 Hz video: video/VP8 @ 90000 Hz

Codec eines bestimmten Receivers abfragen

const getReceiverCodec = async (receiver) => {
  const report = await receiver.getStats();
  for (const stats of report.values()) {
    if (stats.type === 'inbound-rtp' && stats.codecId) {
      const { mimeType, payloadType, sdpFmtpLine } = report.get(stats.codecId) ?? {};
      return { mimeType, payloadType, sdpFmtpLine };
    }
  }
  return null; // noch kein Codec ausgehandelt
};

const [videoReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'video');
console.log(await getReceiverCodec(videoReceiver));
{ mimeType: 'video/H264', payloadType: 102, sdpFmtpLine: 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f' }

Codec-Wechsel während eines Anrufs erkennen

let lastCodecId;

const timer = setInterval(async () => {
  const report = await pc.getStats();
  const inbound = [...report.values()].find(
    (s) => s.type === 'inbound-rtp' && s.kind === 'video'
  );
  if (inbound?.codecId && inbound.codecId !== lastCodecId) {
    lastCodecId = inbound.codecId;
    console.log('Neuer Video-Codec:', report.get(inbound.codecId)?.mimeType);
  }
}, 2000);

// Beim Auflegen aufräumen
pc.addEventListener('connectionstatechange', () => {
  if (pc.connectionState === 'closed') clearInterval(timer);
});
Neuer Video-Codec: video/VP9

// Wichtig · Fallstricke

  • Kann fehlen: Direkt nach dem Verbindungsaufbau oder bevor RTP-Pakete eintreffen, ist codecId oft undefined. Prüfe den Wert immer, bevor du report.get() aufrufst.
  • Nur im selben Bericht gültig: Den zugehörigen RTCCodecStats-Eintrag nur im selben RTCStatsReport nachschlagen. IDs können sich zwischen Verbindungen und bei Neuverhandlung ändern. Ihr Format (z. B. "CIT01_111_minptime=10;useinbandfec=1" in Chrome) ist browserabhängig und darf nicht ausgewertet werden.
  • Codec-Wechsel: Nach einer Neuverhandlung (setRemoteDescription) kann der Inbound-Stream auf eine andere codecId zeigen.
  • Kompatibilität: Wird in Chrome/Edge, Firefox und Safari unterstützt. Ältere Browserversionen lieferten Codec-Einträge nur teilweise (z. B. fehlendes sdpFmtpLine). Verwende deshalb optionale Verkettung (?.).
  • Performance: getStats() ist asynchron und nicht kostenlos. Frage es nicht öfter als etwa ein- bis zweimal pro Sekunde ab.