Signatur
Beschreibung
Die Eigenschaft codecId eines RTCInboundRtpStreamStats-Eintrags (Typ "inbound-rtp") ist ein String. Er verweist auf ein RTCCodecStats-Objekt (Typ "codec") im selben RTCStatsReport. Dort stehen die Angaben zum Codec, mit dem der empfangene RTP-Stream dekodiert wird, zum Beispiel mimeType ("video/VP8", "audio/opus"), clockRate, channels, payloadType und sdpFmtpLine.
Die Codec-Daten stehen also nicht direkt im Inbound-Eintrag. codecId ist nur ein Fremdschlüssel. Die eigentlichen Werte holst du dir mit report.get(stats.codecId). Das ist nützlich, wenn du prüfen willst, welcher Codec nach der SDP-Aushandlung wirklich benutzt wird, oder wenn du Qualitätswerte wie framesDecoded oder jitter je Codec auswerten willst.
Die ID ist ein vom Browser vergebener, undurchsichtiger Bezeichner. Sie gilt nur innerhalb eines Berichts bzw. einer RTCPeerConnection. Solange noch keine Pakete empfangen wurden oder kein Codec feststeht, fehlt die Eigenschaft (undefined).
Rückgabewert
id des zugehörigen RTCCodecStats-Objekts im selben RTCStatsReport. undefined, wenn noch kein Codec feststeht.Beispiele
Codec aller eingehenden Streams ermitteln
// pc ist eine bestehende, verbundene RTCPeerConnection
const logInboundCodecs = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'inbound-rtp' || !stats.codecId) return;
const codec = report.get(stats.codecId);
console.log(`${stats.kind}: ${codec?.mimeType} @ ${codec?.clockRate} Hz`);
});
};
await logInboundCodecs(pc);
Codec eines bestimmten Receivers abfragen
const getReceiverCodec = async (receiver) => {
const report = await receiver.getStats();
for (const stats of report.values()) {
if (stats.type === 'inbound-rtp' && stats.codecId) {
const { mimeType, payloadType, sdpFmtpLine } = report.get(stats.codecId) ?? {};
return { mimeType, payloadType, sdpFmtpLine };
}
}
return null; // noch kein Codec ausgehandelt
};
const [videoReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'video');
console.log(await getReceiverCodec(videoReceiver));
Codec-Wechsel während eines Anrufs erkennen
let lastCodecId;
const timer = setInterval(async () => {
const report = await pc.getStats();
const inbound = [...report.values()].find(
(s) => s.type === 'inbound-rtp' && s.kind === 'video'
);
if (inbound?.codecId && inbound.codecId !== lastCodecId) {
lastCodecId = inbound.codecId;
console.log('Neuer Video-Codec:', report.get(inbound.codecId)?.mimeType);
}
}, 2000);
// Beim Auflegen aufräumen
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'closed') clearInterval(timer);
});
// Wichtig · Fallstricke
- Kann fehlen: Direkt nach dem Verbindungsaufbau oder bevor RTP-Pakete eintreffen, ist
codecIdoftundefined. Prüfe den Wert immer, bevor dureport.get()aufrufst. - Nur im selben Bericht gültig: Den zugehörigen
RTCCodecStats-Eintrag nur im selbenRTCStatsReportnachschlagen. IDs können sich zwischen Verbindungen und bei Neuverhandlung ändern. Ihr Format (z. B."CIT01_111_minptime=10;useinbandfec=1"in Chrome) ist browserabhängig und darf nicht ausgewertet werden. - Codec-Wechsel: Nach einer Neuverhandlung (
setRemoteDescription) kann der Inbound-Stream auf eine anderecodecIdzeigen. - Kompatibilität: Wird in Chrome/Edge, Firefox und Safari unterstützt. Ältere Browserversionen lieferten Codec-Einträge nur teilweise (z. B. fehlendes
sdpFmtpLine). Verwende deshalb optionale Verkettung (?.). - Performance:
getStats()ist asynchron und nicht kostenlos. Frage es nicht öfter als etwa ein- bis zweimal pro Sekunde ab.