Start · Sprachen · JavaScript · Referenz · RTCCodecStats.clockRate

RTCCodecStats.clockRate

Eigenschaft

Positive Ganzzahl mit der Taktrate des Codecs in Hertz (Hz), wie sie im SDP (<code>a=rtpmap</code>) für den RTP-Zeitstempel ausgehandelt wurde.

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

Signatur

RTCCodecStats.clockRate

Beschreibung

Die Eigenschaft clockRate eines RTCCodecStats-Objekts gibt die RTP-Taktrate des verwendeten Codecs in Hertz an. Das ist die Frequenz, mit der der RTP-Zeitstempel hochgezählt wird. Die Werte stammen aus der SDP-Aushandlung, genauer aus der Zeile a=rtpmap:<payloadType> <codec>/<clockRate>.

Typische Werte sind 48000 bei Opus, 8000 bei PCMU/PCMA (G.711) und G.722 (historisch bedingt, obwohl G.722 mit 16 kHz abtastet) sowie 90000 bei allen gängigen Video-Codecs wie VP8, VP9, H.264 und AV1. Bei Video ist die Taktrate also keine Abtastrate im eigentlichen Sinn, sondern nur die Auflösung der Zeitstempel.

Du brauchst clockRate vor allem, um RTP-Zeitstempel in Sekunden umzurechnen, um Jitter-Werte zu deuten und um in Diagnose-Dashboards anzuzeigen, welcher Codec mit welchen Parametern ausgehandelt wurde. Den Wert bekommst du über RTCPeerConnection.getStats(): Du suchst die Einträge mit type === "codec" heraus oder folgst der codecId eines inbound-rtp- bzw. outbound-rtp-Eintrags.

Rückgabewert

Typ
number | undefined
Beschreibung
Eine positive Ganzzahl mit der Taktrate in Hz, z. B. 48000 oder 90000. Steht im SDP keine Taktrate, kann die Eigenschaft fehlen (undefined).

Beispiele

Alle ausgehandelten Codecs mit ihrer Taktrate auflisten

const listCodecs = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'codec') {
      console.log(`${stats.mimeType} (PT ${stats.payloadType}): ${stats.clockRate} Hz`);
    }
  });
};

// pc ist eine bereits verbundene RTCPeerConnection
await listCodecs(pc);
audio/opus (PT 111): 48000 Hz video/VP8 (PT 96): 90000 Hz

Codec eines eingehenden Streams über codecId ermitteln

const getInboundCodecInfo = async (pc) => {
  const report = await pc.getStats();
  const result = [];
  for (const stats of report.values()) {
    if (stats.type === 'inbound-rtp' && stats.codecId) {
      const codec = report.get(stats.codecId);
      result.push({
        kind: stats.kind,
        codec: codec?.mimeType,
        clockRate: codec?.clockRate
      });
    }
  }
  return result;
};

console.table(await getInboundCodecInfo(pc));
[{ kind: 'audio', codec: 'audio/opus', clockRate: 48000 }, { kind: 'video', codec: 'video/VP8', clockRate: 90000 }]

RTP-Zeitstempel-Differenz in Sekunden umrechnen

// Zwei RTP-Zeitstempel eines Video-Streams (Einheit: Takte)
const rtpTimestampA = 1_234_000;
const rtpTimestampB = 1_324_000;

const toSeconds = (deltaTicks, clockRate) => deltaTicks / clockRate;

const clockRate = 90000; // z. B. aus codecStats.clockRate
console.log(`${toSeconds(rtpTimestampB - rtpTimestampA, clockRate)} s`);
1 s

// Wichtig · Fallstricke

  • Keine echte Abtastrate bei Video: Video-Codecs verwenden fast immer 90000 Hz. Über die Bildrate oder Auflösung sagt der Wert nichts aus, dafür gibt es framesPerSecond in RTCInboundRtpStreamStats.
  • G.722-Sonderfall: Das SDP meldet 8000 Hz, obwohl der Codec intern mit 16 kHz abtastet. Wenn du Audioqualität bewerten willst, nimm den Wert nicht einfach als Audio-Abtastrate.
  • Codec-Statistiken erscheinen erst, wenn ein Codec auch tatsächlich von einem RTP-Stream verwendet wird. Vor Abschluss der Aushandlung liefert getStats() meist keine codec-Einträge.
  • Die Eigenschaft ist optional. Frage sie deshalb defensiv ab (z. B. codec?.clockRate ?? 0).
  • Browser-Kompatibilität: Chromium-Browser, Firefox und Safari unterstützen die Eigenschaft. Ältere Versionen haben Codec-Statistiken zum Teil unvollständig oder unter anderen IDs geliefert. Bei bibliotheksübergreifendem Code hilft webrtc-adapter.