Signatur
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
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));
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'));
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]);
// Wichtig · Fallstricke
- Statisch:
receiver.getCapabilities()an einer Instanz gibt es nicht. Richtig istRTCRtpReceiver.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(). BeisetCodecPreferences()auf einemsendrecv-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/redodervideo/ulpfecentfernt, 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.