Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.codecId

RTCOutboundRtpStreamStats.codecId

Eigenschaft

String-ID, die auf das <code>RTCCodecStats</code>-Objekt im selben Statistikbericht verweist und damit den Codec des ausgehenden RTP-Streams beschreibt.

seit JavaScript Baseline: Chrome 67+, Firefox 57+, Safari 12.1+ (W Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.codecId

Beschreibung

Die schreibgeschützte Eigenschaft codecId eines RTCOutboundRtpStreamStats-Objekts (Typ "outbound-rtp") enthält einen String. Er identifiziert eindeutig das RTCCodecStats-Objekt (Typ "codec"), in dem der Codec des gesendeten Streams beschrieben ist. Die Eigenschaft enthält also nicht den Codec-Namen selbst, sondern nur einen Verweis.

Um den tatsächlichen Codec zu ermitteln, zum Beispiel video/VP8, video/H264 oder audio/opus, schlägt man die ID im selben RTCStatsReport nach: report.get(stats.codecId). Das liefert ein Objekt mit Feldern wie mimeType, payloadType, clockRate, channels und sdpFmtpLine.

Typische Einsatzfälle sind Dashboards zur Verbindungsqualität, Fehlersuche bei der Codec-Aushandlung (etwa wenn H.264 statt VP9 gewählt wurde) und Protokolle für Analysen. Weil sich der Codec während einer Sitzung ändern kann, z. B. nach einer Neuverhandlung oder durch RTCRtpSender.setParameters(), sollte man den Wert bei jedem Abruf der Statistiken neu auswerten.

Rückgabewert

Typ
string | undefined
Beschreibung
Die ID des zugehörigen RTCCodecStats-Eintrags im selben RTCStatsReport. Ist undefined, solange noch kein Codec festgelegt wurde, z. B. bevor Pakete gesendet wurden.

Beispiele

Codec des gesendeten Videos ermitteln

const logOutboundCodec = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'outbound-rtp' && stats.kind === 'video' && stats.codecId) {
      const codec = report.get(stats.codecId);
      console.log(`Video-Codec: ${codec?.mimeType} (PT ${codec?.payloadType})`);
    }
  });
};

// pc ist eine verbundene RTCPeerConnection
await logOutboundCodec(pc);
Video-Codec: video/VP8 (PT 96)

Codec pro Sender über RTCRtpSender.getStats() abfragen

const codecsPerSender = async (pc) => {
  const result = [];
  for (const sender of pc.getSenders()) {
    if (!sender.track) continue;
    const report = await sender.getStats();
    for (const stats of report.values()) {
      if (stats.type !== 'outbound-rtp') continue;
      const codec = stats.codecId ? report.get(stats.codecId) : null;
      result.push({
        kind: sender.track.kind,
        ssrc: stats.ssrc,
        codec: codec?.mimeType ?? 'unbekannt',
        clockRate: codec?.clockRate
      });
    }
  }
  return result;
};

console.table(await codecsPerSender(pc));
[{ kind: 'audio', ssrc: 12345678, codec: 'audio/opus', clockRate: 48000 }, { kind: 'video', ssrc: 87654321, codec: 'video/H264', clockRate: 90000 }]

Codec-Wechsel während der Sitzung erkennen

let lastCodecId = null;

const watchCodec = (pc, intervalMs = 2000) => setInterval(async () => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type === 'outbound-rtp' && stats.kind === 'video') {
      if (stats.codecId && stats.codecId !== lastCodecId) {
        const codec = report.get(stats.codecId);
        console.log('Codec gewechselt zu', codec?.mimeType, codec?.sdpFmtpLine ?? '');
        lastCodecId = stats.codecId;
      }
    }
  }
}, intervalMs);

const timer = watchCodec(pc);
// später: clearInterval(timer);
Codec gewechselt zu video/H264 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f

// Wichtig · Fallstricke

  • Nur ein Verweis: codecId ist eine interne ID, zum Beispiel "COT01_96", und kein Codec-Name. Das Format ist vom Browser abhängig und kann sich ändern. Man sollte den String deshalb nie selbst auswerten, sondern immer über report.get() nachschlagen.
  • Kann fehlen: Vor dem ersten gesendeten Paket oder bei inaktiven Sendern ist die Eigenschaft oft undefined. Vor dem Nachschlagen immer prüfen.
  • Gleicher Bericht: Die ID ist nur innerhalb desselben RTCStatsReport zuverlässig auflösbar. Nicht mit einem älteren Bericht kombinieren.
  • Simulcast: Bei Simulcast gibt es mehrere outbound-rtp-Einträge, einen pro Layer bzw. rid. Jeder hat eine eigene codecId.
  • Kompatibilität: Wird in allen modernen Browsern unterstützt. Ältere Versionen von Firefox und Safari lieferten in der Codec-Statistik teilweise unvollständige Felder, etwa kein sdpFmtpLine. Optionale Verkettung (?.) verwenden.