Start · Sprachen · JavaScript · Referenz · RTCCodecStats.sdpFmtpLine

RTCCodecStats.sdpFmtpLine

Eigenschaft

String mit den formatspezifischen Parametern (<code>a=fmtp</code>-Zeile aus dem SDP) eines Codecs in einer WebRTC-Verbindung, z. B. <code>minptime=10;useinbandfec=1</code>.

seit JavaScript Baseline 2023 (Chrome, Edge, Firefox, Safari) Kategorie: webapi

Signatur

RTCCodecStats.sdpFmtpLine

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

Typ
string | undefined
Beschreibung
Die formatspezifischen Parameter als String, meist als durch Semikolon getrennte 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);
audio/opus (PT 111): minptime=10;useinbandfec=1 video/H264 (PT 102): level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f

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));
{ mimeType: 'video/VP9', fmtp: 'profile-id=0' }

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');
{ minptime: '10', useinbandfec: '1' } FEC aktiv: true

// Wichtig · Fallstricke

  • Die Eigenschaft ist optional. Codecs ohne a=fmtp-Zeile liefern undefined. 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) in sdpFmtpLine auftaucht, 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.