Start · Sprachen · JavaScript · Referenz · RTCRtpReceiver.getCapabilities()

RTCRtpReceiver.getCapabilities()

Methode

Statische Methode, die die Codecs und RTP-Header-Erweiterungen zurückgibt, die ein <code>RTCRtpReceiver</code> auf dem aktuellen Gerät für Audio oder Video empfangen kann.

seit JavaScript Baseline: seit 2023 in allen gängigen Browsern (Ch Kategorie: webapi

Signatur

RTCRtpReceiver.getCapabilities(kind)

Beschreibung

RTCRtpReceiver.getCapabilities() ist eine statische Methode. Man ruft sie also direkt an der Klasse auf und nicht an einer Instanz. Sie gibt an, welche Medienformate (Codecs) und RTP-Header-Erweiterungen der Browser für eingehende Audio- oder Videoströme unterstützt. Eine RTCPeerConnection ist dafür nicht nötig.

Meistens nutzt man die Methode zusammen mit RTCRtpTransceiver.setCodecPreferences(): Zuerst fragt man die unterstützten Codecs ab, dann filtert oder sortiert man sie (zum Beispiel VP9 oder AV1 vor VP8, Opus vor anderen Audio-Codecs) und übergibt die Liste als Präferenz, bevor Angebot oder Antwort (Offer/Answer) erzeugt werden. Außerdem eignet sie sich zur Funktionserkennung, etwa um zu prüfen, ob ein Gerät H.264 oder AV1 dekodieren kann.

Das Ergebnis ist ein Objekt mit zwei Feldern: codecs ist ein Array mit Objekten der Form { mimeType, clockRate, channels?, sdpFmtpLine? }, und headerExtensions ist ein Array mit Objekten der Form { uri }. Neben den eigentlichen Medien-Codecs tauchen auch Hilfsformate wie video/rtx, video/red, video/ulpfec oder audio/telephone-event auf.

Parameter

Name Typ Default Beschreibung
$kind Pflicht "audio" | "video" Die Medienart, deren Empfangsfähigkeiten abgefragt werden. Andere Werte führen zum Rückgabewert null.

Rückgabewert

Typ
RTCRtpCapabilities | null
Beschreibung
Ein Objekt mit den Arrays codecs (unterstützte Codecs mit mimeType, clockRate, optional channels und sdpFmtpLine) und headerExtensions (Objekte mit uri). Bei einem ungültigen kind kommt null zurück.

Beispiele

Unterstützte Video-Codecs auflisten

const caps = RTCRtpReceiver.getCapabilities('video');

// Doppelte Einträge (z. B. H.264 mit verschiedenen Profilen) zusammenfassen
const mimeTypes = [...new Set(caps.codecs.map((c) => c.mimeType))];
console.log(mimeTypes);

console.log(caps.headerExtensions.map((h) => h.uri).slice(0, 2));
["video/VP8", "video/rtx", "video/VP9", "video/H264", "video/AV1", "video/red", "video/ulpfec"] ["urn:ietf:params:rtp-hdrext:toffset", "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"]

Prüfen, ob ein Codec dekodiert werden kann

const canReceive = (kind, mimeType) => {
  const caps = RTCRtpReceiver.getCapabilities?.(kind);
  return !!caps?.codecs.some(
    (c) => c.mimeType.toLowerCase() === mimeType.toLowerCase()
  );
};

console.log('AV1:', canReceive('video', 'video/AV1'));
console.log('Opus:', canReceive('audio', 'audio/opus'));
AV1: true Opus: true

Codec-Präferenz vor dem Offer setzen (VP9 zuerst)

const pc = new RTCPeerConnection();
const transceiver = pc.addTransceiver('video', { direction: 'recvonly' });

const { codecs } = RTCRtpReceiver.getCapabilities('video');

// VP9 nach vorn sortieren, alle anderen Codecs in ihrer Reihenfolge lassen
const preferred = [
  ...codecs.filter((c) => c.mimeType === 'video/VP9'),
  ...codecs.filter((c) => c.mimeType !== 'video/VP9'),
];

if ('setCodecPreferences' in transceiver) {
  transceiver.setCodecPreferences(preferred);
}

const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
console.log(offer.sdp.match(/a=rtpmap:\d+ \S+/)[0]);
a=rtpmap:98 VP9/90000

// Wichtig · Fallstricke

  • Statisch: receiver.getCapabilities() an einer Instanz gibt es nicht. Richtig ist RTCRtpReceiver.getCapabilities('video').
  • Sender und Empfänger können sich unterscheiden: Was ein Gerät dekodieren kann, kann es nicht unbedingt auch kodieren, und umgekehrt. Für die Sendeseite gibt es RTCRtpSender.getCapabilities(). Bei setCodecPreferences() auf einem sendrecv-Transceiver sollte man nur Codecs übergeben, die in beiden Listen vorkommen. Sonst lösen manche Browser einen Fehler (InvalidModificationError) aus.
  • Hilfs-Codecs behalten: Wer beim Filtern video/rtx, video/red oder video/ulpfec entfernt, schaltet damit Neuübertragung und Fehlerkorrektur ab.
  • Datenschutz: Die Codec-Liste kann für Browser-Fingerprinting genutzt werden. Deshalb geben manche Browser nur eine eingeschränkte oder vereinheitlichte Liste zurück.
  • Kompatibilität: Chrome und Safari unterstützen die Methode schon lange, Firefox erst seit Version 110. In älteren Umgebungen sollte man vorher auf typeof RTCRtpReceiver.getCapabilities === 'function' prüfen. Die Liste hängt von Hardware und Betriebssystem ab (z. B. H.264 oder AV1 über Hardware-Decoder) und kann sich zwischen Geräten unterscheiden.