Start · Sprachen · JavaScript · Referenz · RTCRemoteOutboundRtpStreamStats.codecId

RTCRemoteOutboundRtpStreamStats.codecId

Eigenschaft

String-ID des <code>RTCCodecStats</code>-Objekts, das den Codec des vom entfernten Peer gesendeten RTP-Streams beschreibt.

seit JavaScript Chrome 67+, Firefox 69+, Safari 11+ (je nach Brows Kategorie: webapi

Signatur

RTCRemoteOutboundRtpStreamStats.codecId

Beschreibung

Die Eigenschaft codecId eines RTCRemoteOutboundRtpStreamStats-Eintrags (Statistiktyp "remote-outbound-rtp") enthält einen String. Er gehört zu dem RTCCodecStats-Objekt (Typ "codec") im selben RTCStatsReport, das den Codec dieses RTP-Streams beschreibt. Der Wert ist also ein Verweis und nicht der Codec-Name selbst.

remote-outbound-rtp-Statistiken beschreiben den Stream, den der entfernte Peer sendet. Sie beruhen auf RTCP-Sender-Reports, die der Gegenseite zugestellt wurden. Mit codecId findest du heraus, welchen Codec (z. B. video/VP8 oder audio/opus) die Gegenseite für diesen Stream verwendet, samt Payload-Typ, Taktrate und sdpFmtpLine.

Typische Nutzung: Du holst mit RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() einen Bericht und suchst die remote-outbound-rtp-Einträge heraus. Den passenden Codec schlägst du dann mit report.get(stats.codecId) nach. Das ist hilfreich für Diagnose-Dashboards oder um die Codec-Aushandlung zu prüfen.

Rückgabewert

Typ
string | undefined
Beschreibung
Die ID eines RTCCodecStats-Eintrags im selben RTCStatsReport. undefined, wenn der Browser die Eigenschaft nicht liefert oder noch kein Codec feststeht.

Beispiele

Codec des entfernten Senders ermitteln

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

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

Statistik pro Empfänger mit Codec-Details

const describeReceiver = async (receiver) => {
  const report = await receiver.getStats();
  const remote = [...report.values()].find((s) => s.type === 'remote-outbound-rtp');
  if (!remote?.codecId) return null;
  const { mimeType, payloadType, sdpFmtpLine } = report.get(remote.codecId) ?? {};
  return { ssrc: remote.ssrc, mimeType, payloadType, sdpFmtpLine };
};

for (const receiver of pc.getReceivers()) {
  console.log(await describeReceiver(receiver));
}
{ ssrc: 2873640512, mimeType: 'audio/opus', payloadType: 111, sdpFmtpLine: 'minptime=10;useinbandfec=1' }

Codec-Wechsel der Gegenseite überwachen

let lastCodecId = null;

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

// Aufräumen beim Schließen der Verbindung
pc.addEventListener('connectionstatechange', () => {
  if (pc.connectionState === 'closed') clearInterval(timer);
});
Neuer Video-Codec: video/VP8

// Wichtig · Fallstricke

  • Nur ein Verweis: codecId ist eine ID und kein Codec-Name. Die Details liest du erst über report.get(codecId) aus. Das funktioniert nur im selben Bericht, weil IDs zwischen zwei getStats()-Aufrufen nicht garantiert gleich bleiben.
  • Verzögerte Verfügbarkeit: remote-outbound-rtp-Einträge gibt es erst, wenn RTCP-Sender-Reports der Gegenseite eingetroffen sind. Direkt nach dem Verbindungsaufbau können sie fehlen.
  • Browser-Kompatibilität: Wie vollständig die Einträge sind, hängt vom Browser ab. Firefox liefert remote-outbound-rtp schon lange, Chromium-Browser erst in neueren Versionen. Prüfe deshalb immer, ob codecId vorhanden ist, statt es vorauszusetzen.
  • Der Wert ist schreibgeschützt: Das Statistik-Objekt ist nur eine Momentaufnahme, Änderungen daran wirken sich nicht auf die Verbindung aus.