Start · Sprachen · JavaScript · Referenz · RTCCodecStats.payloadType

RTCCodecStats.payloadType

Eigenschaft

Ganzzahl von 0 bis 127, die den RTP-Payload-Typ angibt, mit dem dieser Codec beim Codieren oder Decodieren von RTP-Paketen gekennzeichnet wird.

seit JavaScript Baseline 2023: Chrome 80+, Firefox 55+, Safari 12. Kategorie: webapi

Signatur

RTCCodecStats.payloadType

Beschreibung

Die Eigenschaft payloadType des Wörterbuchs RTCCodecStats enthält den RTP-Payload-Typ (PT). Das ist eine Zahl von 0 bis 127, die im 7-Bit-Feld „PT“ jedes RTP-Headers steht. Der Empfänger erkennt daran, mit welchem Codec die Nutzdaten eines Pakets codiert sind.

Die Werte 0–95 sind laut RFC 3551 statisch vergeben (z. B. 0 = PCMU, 8 = PCMA, 9 = G.722). Moderne Codecs wie Opus, VP8, VP9, H.264 oder AV1 nutzen dagegen dynamische Payload-Typen im Bereich 96–127. Welcher Codec welche Nummer bekommt, wird per SDP-Aushandlung in den Zeilen a=rtpmap: festgelegt. Deshalb kann derselbe Codec in verschiedenen Verbindungen unterschiedliche Nummern haben.

Den Wert erhalten Sie über RTCPeerConnection.getStats() bzw. RTCRtpSender.getStats() / RTCRtpReceiver.getStats(). Der zurückgegebene RTCStatsReport enthält Einträge vom Typ "codec". Die Eigenschaft eignet sich für Diagnose und Überwachung, etwa um den tatsächlich genutzten Codec zu ermitteln oder um Stats-Einträge mit dem ausgehandelten SDP abzugleichen.

Rückgabewert

Typ
number
Beschreibung
Nur-lesbare, positive Ganzzahl (unsigned long) im Bereich 0–127: der RTP-Payload-Typ des Codecs.

Beispiele

Alle Codec-Statistiken mit Payload-Typ auflisten

const listCodecs = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'codec') {
      console.log(`PT ${stats.payloadType}: ${stats.mimeType} @ ${stats.clockRate} Hz`);
    }
  });
};

// Aufruf mit einer bestehenden, verbundenen RTCPeerConnection
await listCodecs(peerConnection);
PT 111: audio/opus @ 48000 Hz PT 96: video/VP8 @ 90000 Hz

Tatsächlich gesendeten Video-Codec 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 { payloadType: codec.payloadType, mimeType: codec.mimeType };
    }
  }
  return null;
};

const active = await getActiveVideoCodec(peerConnection);
console.log(active);
{ payloadType: 96, mimeType: 'video/VP8' }

Payload-Typ mit der SDP-Aushandlung abgleichen

const findRtpmap = (sdp, payloadType) => {
  const line = sdp.split('\r\n').find((l) => l.startsWith(`a=rtpmap:${payloadType} `));
  return line ?? 'nicht gefunden';
};

const report = await peerConnection.getStats();
const codec = [...report.values()].find((s) => s.type === 'codec');
if (codec) {
  console.log(findRtpmap(peerConnection.currentLocalDescription.sdp, codec.payloadType));
}
a=rtpmap:111 opus/48000/2

// Wichtig · Fallstricke

  • Dynamische Nummern: Werte ab 96 werden pro Sitzung ausgehandelt. Codieren Sie keine festen Zuordnungen wie „96 = VP8“ fest ein, sondern verwenden Sie immer mimeType, um den Codec zu erkennen.
  • Nur genutzte Codecs: Browser melden in der Regel nur Codec-Einträge, auf die ein RTP-Stream (codecId) tatsächlich verweist. Vor dem Verbindungsaufbau oder ohne aktive Übertragung kann der Report deshalb leer sein.
  • Mehrere Einträge möglich: Derselbe Payload-Typ kann mehrfach vorkommen, z. B. für verschiedene Transports oder für Sende- und Empfangsrichtung. Die Einträge unterscheiden sich dann in transportId bzw. id.
  • Kompatibilität: In Chrome, Firefox und Safari verfügbar. Ältere Implementierungen hatten teils das inzwischen entfernte Feld codecType. Für breite Unterstützung empfiehlt sich webrtc-adapter.
  • Datenschutz: Die Stats-Daten verraten, welche Codecs unterstützt werden, und können so zum Fingerprinting beitragen. Senden Sie sie nur anonymisiert an Telemetrie-Server.