Start · Sprachen · JavaScript · Referenz · RTCRemoteInboundRtpStreamStats.codecId

RTCRemoteInboundRtpStreamStats.codecId

Eigenschaft

String mit der ID des <code>RTCCodecStats</code>-Eintrags, der den Codec des RTP-Streams beschreibt, über den die Gegenstelle berichtet.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (WebRTC-St Kategorie: webapi

Signatur

RTCRemoteInboundRtpStreamStats.codecId

Beschreibung

Die Eigenschaft codecId eines RTCRemoteInboundRtpStreamStats-Objekts (Statistiktyp "remote-inbound-rtp") enthält einen String. Er verweist auf das RTCCodecStats-Objekt (Typ "codec") im selben RTCStatsReport. Dort stehen die Angaben zum Codec, mit dem der lokal gesendete und von der Gegenstelle empfangene RTP-Stream kodiert ist, zum Beispiel MIME-Typ, Taktrate, Kanalanzahl und SDP-fmtp-Zeile.

Die Remote-Inbound-Statistik kommt aus RTCP-Receiver-Reports der Gegenstelle. Sie beschreibt also, wie die andere Seite Ihren gesendeten Stream empfängt: Paketverluste, Jitter und Round-Trip-Time. Über codecId ordnen Sie diese Qualitätswerte einem konkreten Codec zu. So sehen Sie etwa, ob bei VP8 mehr Verluste auftreten als bei H.264 oder Opus.

Die ID ist nur innerhalb eines Berichts gültig. Sie lösen sie auf, indem Sie mit report.get(stats.codecId) im selben RTCStatsReport nachschlagen, den RTCPeerConnection.getStats() oder RTCRtpSender.getStats() zurückgibt.

Rückgabewert

Typ
string | undefined
Beschreibung
Die eindeutige ID des zugehörigen RTCCodecStats-Objekts im selben Statistikbericht. Ist sie nicht vorhanden, ist der Wert undefined, etwa wenn noch kein Codec ausgehandelt wurde.

Beispiele

Codec zu einem Remote-Inbound-Stream ermitteln

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

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

Empfangsqualität der Gegenstelle pro Codec auswerten

const qualityByCodec = async (sender) => {
  // Statistiken nur für diesen RTCRtpSender
  const report = await sender.getStats();
  const result = [];
  for (const stats of report.values()) {
    if (stats.type !== 'remote-inbound-rtp') continue;
    const codec = stats.codecId ? report.get(stats.codecId) : undefined;
    result.push({
      codec: codec?.mimeType ?? 'unbekannt',
      paketeVerloren: stats.packetsLost,
      jitter: stats.jitter,
      rttMs: stats.roundTripTime != null ? stats.roundTripTime * 1000 : null
    });
  }
  return result;
};

const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
console.table(await qualityByCodec(videoSender));
┌─────────┬─────────────┬────────────────┬────────┬───────┐ │ (index) │ codec │ paketeVerloren │ jitter │ rttMs │ │ 0 │ 'video/VP8' │ 3 │ 0.004 │ 42 │ └─────────┴─────────────┴────────────────┴────────┴───────┘

Codec-Wechsel während der Verbindung erkennen

let lastCodecId = null;

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

// Später aufräumen: clearInterval(timer);
Neuer Codec: video/VP8

// Wichtig · Fallstricke

  • Nur innerhalb eines Berichts gültig: Lösen Sie die ID immer im selben RTCStatsReport auf. Speichern Sie keine RTCCodecStats-Objekte, um sie mit späteren Berichten zu vergleichen. Die Werte sind Momentaufnahmen.
  • Nicht sofort vorhanden: remote-inbound-rtp-Einträge erscheinen erst, wenn der erste RTCP-Receiver-Report der Gegenstelle eingegangen ist. Das dauert typischerweise einige Sekunden nach dem Verbindungsaufbau. Vorher fehlt der Eintrag ganz oder codecId ist undefined. Prüfen Sie deshalb immer mit optionaler Verkettung (?.).
  • Format der ID: Das Format ist browserabhängig und undurchsichtig, in Chrome zum Beispiel "CIT01_96_...". Lesen Sie keine Informationen aus dem String heraus, sondern nutzen Sie ihn nur als Schlüssel.
  • Browserunterschiede: Ältere Firefox- und Safari-Versionen lieferten codecId bei Remote-Statistiken nicht immer. Codec-Einträge können außerdem gemeinsam genutzt werden, wenn mehrere Streams denselben Payload-Typ auf demselben Transport verwenden.