Signatur
Beschreibung
Die Eigenschaft id eines RTCCodecStats-Objekts ist ein String, der dieses Statistikobjekt und damit den Codec, den es beschreibt, eindeutig bezeichnet. Wenn Sie RTCPeerConnection.getStats() aufrufen, erhalten Sie einen RTCStatsReport. Das ist eine Map-ähnliche Struktur, deren Schlüssel genau diese id-Werte sind.
Wichtig ist die id vor allem für Querverweise: Andere Statistikobjekte wie RTCInboundRtpStreamStats und RTCOutboundRtpStreamStats enthalten die Eigenschaft codecId. Deren Wert ist die id des passenden RTCCodecStats-Eintrags. So finden Sie heraus, welcher Codec (zum Beispiel video/VP8 oder audio/opus) für einen bestimmten RTP-Stream verwendet wird.
Der Wert ist innerhalb einer RTCPeerConnection stabil. Das heißt: Dasselbe überwachte Objekt hat in aufeinanderfolgenden Berichten dieselbe id. Deshalb können Sie Messwerte über die Zeit vergleichen. Das Format des Strings legt der Browser fest, zum Beispiel "COT01_111_minptime=10;useinbandfec=1" in Chrome. Behandeln Sie den Wert daher nur als undurchsichtigen Bezeichner und werten Sie ihn nicht inhaltlich aus.
Rückgabewert
RTCStatsReport. Er entspricht dem Map-Schlüssel und wird von codecId anderer Statistikobjekte referenziert.Beispiele
Alle Codec-Statistiken mit ihrer id auflisten
const listCodecs = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'codec') {
console.log(stats.id, stats.mimeType, stats.payloadType);
}
});
};
// pc ist eine bereits verbundene RTCPeerConnection
await listCodecs(pc);
Verwendeten Codec eines eingehenden Video-Streams ermitteln
const getInboundVideoCodec = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'inbound-rtp' && stats.kind === 'video' && stats.codecId) {
// codecId verweist auf RTCCodecStats.id
const codec = report.get(stats.codecId);
return codec ? `${codec.mimeType} (id: ${codec.id})` : 'unbekannt';
}
}
return 'kein Video-Stream';
};
console.log(await getInboundVideoCodec(pc));
Codec-Wechsel über die Zeit erkennen
let lastCodecId = null;
const watchCodec = (pc, intervalMs = 2000) => setInterval(async () => {
const report = await pc.getStats();
const outbound = [...report.values()]
.find((s) => s.type === 'outbound-rtp' && s.kind === 'video');
if (!outbound?.codecId) return;
if (outbound.codecId !== lastCodecId) {
const codec = report.get(outbound.codecId);
console.log(`Codec gewechselt: ${codec?.mimeType} [${codec?.id}]`);
lastCodecId = outbound.codecId;
}
}, intervalMs);
const timer = watchCodec(pc);
// später: clearInterval(timer);
// Wichtig · Fallstricke
- Nicht auswerten: Das Format der
idist nicht standardisiert und unterscheidet sich zwischen Browsern und Browserversionen. Lesen Sie Codec-Informationen deshalb nicht per String-Zerlegung aus deridheraus. Verwenden Sie stattdessenmimeType,payloadType,clockRateundsdpFmtpLine. - Nur so lange gültig wie die Verbindung: Die
idist nur innerhalb derselbenRTCPeerConnectioneindeutig. Speichern Sie sie nicht über Sitzungen hinweg und vergleichen Sie sie nicht zwischen verschiedenen Verbindungen. - Kann fehlen: Codec-Statistiken erscheinen erst im Bericht, wenn ein Transport den Codec tatsächlich verwendet. Vor dem Verbindungsaufbau oder bei inaktiven Transceivern gibt es unter Umständen keine
type === 'codec'-Einträge. Prüfen Sie außerdem, obcodecIdgesetzt ist, bevor Siereport.get()aufrufen. - Browser-Unterschiede: Die Eigenschaft
idstammt aus dem Basis-WörterbuchRTCStatsund wird von allen modernen Browsern unterstützt. Wann und wie Codec-Statistiken im Bericht erscheinen, hat sich in älteren Firefox- und Safari-Versionen teilweise unterschieden. - Datenschutz: WebRTC-Statistiken lassen Rückschlüsse auf die Geräte- und Netzwerkumgebung zu. Übertragen Sie sie nur bewusst an Telemetrie-Server.