Signatur
Beschreibung
Die Eigenschaft transportId des Wörterbuchs RTCCodecStats enthält die id des zugehörigen RTCTransportStats-Eintrags im selben RTCStatsReport. Damit lässt sich feststellen, über welchen Transport (DTLS/ICE-Verbindung) ein bestimmter Codec tatsächlich verwendet wird.
In der Praxis dient transportId als Fremdschlüssel: Man ruft den Bericht mit RTCPeerConnection.getStats() ab, sucht Einträge vom Typ "codec" und schlägt anschließend mit report.get(codec.transportId) den Transport-Eintrag nach. So kommt man etwa an den Zustand der DTLS-Verbindung, das gewählte ICE-Kandidatenpaar oder die übertragene Datenmenge.
Weil Codec-Einträge pro Transport erzeugt werden, kann derselbe Codec (gleicher mimeType und payloadType) mehrfach im Bericht vorkommen, wenn mehrere Transporte bestehen – z. B. ohne Bundling. Bei max-bundle (dem üblichen Standard) teilen sich meist alle Codecs einen einzigen Transport.
Rückgabewert
id) des RTCTransportStats-Objekts im selben RTCStatsReport. Der Wert ist eine vom Browser vergebene, nicht vorhersagbare Zeichenkette (z. B. "T01").Beispiele
Alle Codecs mit ihrer Transport-ID auflisten
const listCodecTransports = async (pc) => {
const report = await pc.getStats();
report.forEach((stat) => {
if (stat.type === 'codec') {
console.log(`${stat.mimeType} (PT ${stat.payloadType}) -> Transport ${stat.transportId}`);
}
});
};
// pc ist eine bereits verbundene RTCPeerConnection
await listCodecTransports(pc);
Transport-Eintrag zu einem Codec nachschlagen
const getCodecTransportInfo = async (pc) => {
const report = await pc.getStats();
const result = [];
for (const stat of report.values()) {
if (stat.type !== 'codec') continue;
const transport = report.get(stat.transportId);
result.push({
codec: stat.mimeType,
dtlsState: transport?.dtlsState ?? 'unbekannt',
bytesSent: transport?.bytesSent ?? 0
});
}
return result;
};
console.table(await getCodecTransportInfo(pc));
Codecs nach Transport gruppieren
const groupCodecsByTransport = async (pc) => {
const report = await pc.getStats();
const groups = new Map();
for (const stat of report.values()) {
if (stat.type !== 'codec') continue;
const list = groups.get(stat.transportId) ?? [];
list.push(stat.mimeType);
groups.set(stat.transportId, list);
}
return groups;
};
const groups = await groupCodecsByTransport(pc);
console.log(`Anzahl Transporte: ${groups.size}`);
console.log(Object.fromEntries(groups));
// Wichtig · Fallstricke
- Keine stabile ID: Der Wert wird vom Browser vergeben, unterscheidet sich zwischen Browsern und kann sich nach einer ICE-Neuverhandlung ändern. Nicht speichern oder über Sitzungen hinweg vergleichen – immer innerhalb desselben
RTCStatsReportauflösen. - Nur nutzbar nach Verhandlung: Codec-Einträge erscheinen erst, wenn Offer/Answer abgeschlossen sind und der Codec tatsächlich von einem RTP-Stream referenziert wird. Vorher liefert
getStats()keine"codec"-Einträge. - Optional Chaining verwenden:
report.get(transportId)kann in Randfällenundefinedliefern (z. B. bei älteren Implementierungen), daher defensiv zugreifen. - Kompatibilität: Ältere Browser unterstützten
RTCCodecStatsunvollständig; Firefox liefert Codec-Statistiken erst in neueren Versionen. Vor produktivem Einsatz auf Vorhandensein prüfen ('transportId' in stat).