Signatur
Beschreibung
Die schreibgeschützte Eigenschaft sdpFmtpLine eines RTCCodecStats-Objekts enthält den Parameterteil der a=fmtp-Zeile, die im SDP (Session Description Protocol) zum jeweiligen Payload-Typ ausgehandelt wurde. Das Präfix a=fmtp:<payloadType> fehlt dabei. Übrig bleibt nur die Liste der Parameter, etwa minptime=10;useinbandfec=1 bei Opus oder level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f bei H.264.
RTCCodecStats-Einträge bekommt man über RTCPeerConnection.getStats(), RTCRtpSender.getStats() oder RTCRtpReceiver.getStats(). Man erkennt sie am type mit dem Wert "codec". RTP-Stream-Statistiken wie outbound-rtp oder inbound-rtp verweisen über ihre Eigenschaft codecId auf den passenden Codec-Eintrag.
Praktisch ist die Eigenschaft beim Debugging und Monitoring. Man sieht damit, welches H.264-Profil tatsächlich verwendet wird, ob bei Opus Forward Error Correction (useinbandfec=1) oder Stereo aktiv ist, oder welches VP9-Profil (profile-id) ausgehandelt wurde. Das entspricht dem Feld sdpFmtpLine von RTCRtpCodecParameters bzw. RTCRtpCodec.
Rückgabewert
schlüssel=wert-Paare. undefined, wenn der Codec keine a=fmtp-Zeile hat (z. B. PCMU/PCMA oder oft VP8).Beispiele
Alle Codecs einer Verbindung mit fmtp-Parametern auflisten
const listCodecs = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'codec') {
console.log(
`${stats.mimeType} (PT ${stats.payloadType}):`,
stats.sdpFmtpLine ?? '(keine fmtp-Parameter)'
);
}
});
};
// pc ist eine verbundene RTCPeerConnection
await listCodecs(pc);
Tatsächlich gesendeten Video-Codec über codecId ermitteln
const getActiveVideoCodec = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'outbound-rtp' && stats.kind === 'video' && stats.codecId) {
const codec = report.get(stats.codecId);
return { mimeType: codec.mimeType, fmtp: codec.sdpFmtpLine };
}
}
return null;
};
console.log(await getActiveVideoCodec(pc));
fmtp-String in ein Objekt zerlegen und Opus-FEC prüfen
const parseFmtp = (line = '') =>
Object.fromEntries(
line
.split(';')
.map((p) => p.trim())
.filter(Boolean)
.map((p) => {
const [key, ...rest] = p.split('=');
return [key, rest.join('=')];
})
);
const report = await pc.getStats();
const opus = [...report.values()].find(
(s) => s.type === 'codec' && s.mimeType === 'audio/opus'
);
const params = parseFmtp(opus?.sdpFmtpLine);
console.log(params);
console.log('FEC aktiv:', params.useinbandfec === '1');
// Wichtig · Fallstricke
- Die Eigenschaft ist optional. Codecs ohne
a=fmtp-Zeile liefernundefined. Deshalb immer mit??oder optionaler Verkettung absichern. - Der Wert enthält nicht das Präfix
a=fmtp:<PT>, sondern nur die Parameterliste. Reihenfolge und Schreibweise der Parameter können sich je nach Browser unterscheiden. Nicht per String-Vergleich prüfen, sondern die Parameter zerlegen. - Codec-Statistiken erscheinen erst, wenn der Codec tatsächlich von einem RTP-Stream genutzt wird. Vor dem Verbindungsaufbau oder bei inaktiven Transceivern kann der Report deshalb keine
codec-Einträge enthalten. - Ob ein Parameter (z. B.
stereo=1) insdpFmtpLineauftaucht, hängt von der Aushandlung im SDP ab. Die Eigenschaft sagt nichts darüber, ob der Encoder den Parameter tatsächlich umsetzt. - Kompatibilität: Unterstützt in aktuellen Versionen von Chromium, Firefox und Safari. Ältere Browser liefern die Eigenschaft teils nicht oder unvollständig.