Signatur
Beschreibung
Die Eigenschaft codecId eines RTCRemoteInboundRtpStreamStats-Objekts (Statistiktyp "remote-inbound-rtp") enthält einen String. Er verweist auf das RTCCodecStats-Objekt (Typ "codec") im selben RTCStatsReport. Dort stehen die Angaben zum Codec, mit dem der lokal gesendete und von der Gegenstelle empfangene RTP-Stream kodiert ist, zum Beispiel MIME-Typ, Taktrate, Kanalanzahl und SDP-fmtp-Zeile.
Die Remote-Inbound-Statistik kommt aus RTCP-Receiver-Reports der Gegenstelle. Sie beschreibt also, wie die andere Seite Ihren gesendeten Stream empfängt: Paketverluste, Jitter und Round-Trip-Time. Über codecId ordnen Sie diese Qualitätswerte einem konkreten Codec zu. So sehen Sie etwa, ob bei VP8 mehr Verluste auftreten als bei H.264 oder Opus.
Die ID ist nur innerhalb eines Berichts gültig. Sie lösen sie auf, indem Sie mit report.get(stats.codecId) im selben RTCStatsReport nachschlagen, den RTCPeerConnection.getStats() oder RTCRtpSender.getStats() zurückgibt.
Rückgabewert
RTCCodecStats-Objekts im selben Statistikbericht. Ist sie nicht vorhanden, ist der Wert undefined, etwa wenn noch kein Codec ausgehandelt wurde.Beispiele
Codec zu einem Remote-Inbound-Stream ermitteln
// pc ist eine bestehende, verbundene RTCPeerConnection
const logRemoteCodecs = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'remote-inbound-rtp' || !stats.codecId) return;
const codec = report.get(stats.codecId);
console.log(`${stats.kind}: ${codec?.mimeType} @ ${codec?.clockRate} Hz`);
});
};
await logRemoteCodecs(pc);
Empfangsqualität der Gegenstelle pro Codec auswerten
const qualityByCodec = async (sender) => {
// Statistiken nur für diesen RTCRtpSender
const report = await sender.getStats();
const result = [];
for (const stats of report.values()) {
if (stats.type !== 'remote-inbound-rtp') continue;
const codec = stats.codecId ? report.get(stats.codecId) : undefined;
result.push({
codec: codec?.mimeType ?? 'unbekannt',
paketeVerloren: stats.packetsLost,
jitter: stats.jitter,
rttMs: stats.roundTripTime != null ? stats.roundTripTime * 1000 : null
});
}
return result;
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
console.table(await qualityByCodec(videoSender));
Codec-Wechsel während der Verbindung erkennen
let lastCodecId = null;
const timer = setInterval(async () => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'remote-inbound-rtp' && stats.kind === 'video') {
if (stats.codecId && stats.codecId !== lastCodecId) {
console.log('Neuer Codec:', report.get(stats.codecId)?.mimeType);
lastCodecId = stats.codecId;
}
}
}
}, 2000);
// Später aufräumen: clearInterval(timer);
// Wichtig · Fallstricke
- Nur innerhalb eines Berichts gültig: Lösen Sie die ID immer im selben
RTCStatsReportauf. Speichern Sie keineRTCCodecStats-Objekte, um sie mit späteren Berichten zu vergleichen. Die Werte sind Momentaufnahmen. - Nicht sofort vorhanden:
remote-inbound-rtp-Einträge erscheinen erst, wenn der erste RTCP-Receiver-Report der Gegenstelle eingegangen ist. Das dauert typischerweise einige Sekunden nach dem Verbindungsaufbau. Vorher fehlt der Eintrag ganz odercodecIdistundefined. Prüfen Sie deshalb immer mit optionaler Verkettung (?.). - Format der ID: Das Format ist browserabhängig und undurchsichtig, in Chrome zum Beispiel
"CIT01_96_...". Lesen Sie keine Informationen aus dem String heraus, sondern nutzen Sie ihn nur als Schlüssel. - Browserunterschiede: Ältere Firefox- und Safari-Versionen lieferten
codecIdbei Remote-Statistiken nicht immer. Codec-Einträge können außerdem gemeinsam genutzt werden, wenn mehrere Streams denselben Payload-Typ auf demselben Transport verwenden.