Signatur
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
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);
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));
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);
// Wichtig · Fallstricke
- Nur ein Verweis:
codecIdist 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 überreport.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
RTCStatsReportzuverlä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 eigenecodecId. - 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.