Signatur
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
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);
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));
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`);
// Wichtig · Fallstricke
- Keine echte Abtastrate bei Video: Video-Codecs verwenden fast immer
90000Hz. Über die Bildrate oder Auflösung sagt der Wert nichts aus, dafür gibt esframesPerSecondinRTCInboundRtpStreamStats. - G.722-Sonderfall: Das SDP meldet
8000Hz, 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 keinecodec-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.