Video-Codecs
Informationen zu den von OpenTok unterstützten Videocodecs
Die OpenTok-Plattform nutzt das WebRTC-Protokoll und die von WebRTC unterstützten Echtzeit-Videocodecs. Insbesondere unterstützt die OpenTok-Plattform die Videocodecs VP8, VP9 und H.264.
Streams verwenden den VP8-Codec, der von allen Clients unterstützt wird, es sei denn, Sie legen für das Projekt, zu dem die Sitzung gehört, einen bevorzugten Codec fest (siehe Festlegen des bevorzugten Videocodecs für ein Projekt.)
In dem breiten Spektrum an Geräten und Browsern, die OpenTok unterstützt, gibt es unterschiedliche Unterstützungsgrade für die Echtzeit-Videocodecs VP8, VP9 und H.264. Einige Endpunkte unterstützen alle Videocodecs, andere hingegen nur einen einzigen. Je nach Art der Applications, die Sie entwickeln, und den Browsern und Geräten, die Ihre Endnutzer verwenden werden, ändert sich Ihre Wahl des bevorzugten Codecs.
Was ist ein Videocodec?
Ein Videocodec besteht aus zwei Teilen: einem Encoder und einem Decoder. Er kann eingehende digitale Videobilder von einer Webcam in einen Strom binärer Daten kodieren (komprimieren), der über ein Netzwerk übertragen werden kann. Außerdem kann er einen Strom binärer Daten aufnehmen und diesen in einen Strom von Roh-Videobildern dekodieren (dekomprimieren), die auf einem Bildschirm angezeigt werden können. Der Mechanismus zur Kodierung und Dekodierung des Videos wird als Codec-Standard bezeichnet. Im Rahmen dieser Seite werden wir auf zwei beliebte Standards eingehen: VP8 und H.264.
VP8 vs. H.264
Der Echtzeit-Videocodec VP8 ist ein Software-Codec. Er funktioniert auch bei niedrigeren Bitraten gut und ist im Zusammenhang mit WebRTC ein ausgereifter Videocodec. Als Software-Codec kann er innerhalb der Grenzen des Arbeitsspeichers und der CPU so oft instanziiert werden, wie es die Anwendung erfordert. Der VP8-Codec unterstützt die OpenTok – Skalierbare Videolösung Funktion, was bedeutet, dass sie in großen Sitzungen mit unterstützten Browsern und Geräten gut funktioniert.
Der H.264-Echtzeit-Videocodec ist je nach Gerät sowohl in Hardware- als auch in Softwareform verfügbar. Im Zusammenhang mit WebRTC handelt es sich um einen relativ neuen Codec, obwohl er beim Streaming von Filmen und Videoclips über das Internet bereits auf eine lange Geschichte zurückblicken kann. Die Unterstützung durch Hardware-Codecs bedeutet, dass die Haupt-CPU des Geräts bei der Videoverarbeitung weniger stark beansprucht wird, was zu einer geringeren CPU-Auslastung führt. Die Anzahl der Hardware-Instanzen ist geräteabhängig, wobei iOS die beste Unterstützung bietet. Da H.264 ein neuer Codec für WebRTC ist und jedes Gerät eine andere Implementierung haben kann, kann die Qualität variieren. Daher schneidet H.264 bei niedrigeren Bitraten im Vergleich zu VP8 möglicherweise nicht so gut ab. H.264 eignet sich nicht gut für große Sitzungen, da es die OpenTok-Funktion „Scalable Video“ nicht unterstützt.
VP9 vs. VP8
Der VP9-Echtzeit-Codec ist ein relativ neuer Codec. Er findet zunehmend Unterstützung bei Browser- und Hardware-Anbietern. Trotz der zunehmenden Unterstützung ist er noch nicht so weit verbreitet wie die anderen Codecs.
Der VP9-Codec funktioniert, genau wie VP8, bei niedrigeren Bitraten gut als H.264. Zudem benötigt VP9 noch weniger Bandbreite als VP8 für die Videokodierung. Die Verbesserungen bei der Komprimierung gehen jedoch mit einem Kompromiss einher: Die Kodierung und Dekodierung beanspruchen mehr CPU-Leistung als bei VP8.
Der VP9-Codec unterstützt Skalierbare Videokodierung in weitergeleitete Sitzungen. Für weitere Informationen siehe VP9 Skalierbare Videocodierung für geroutete Sitzungen.
Festlegen des bevorzugten Videocodecs für ein Projekt
Auf der Projektseite Ihres können Sie den bevorzugten Videocodec für ein Projekt festlegen. Video API-Konto. Zulässige Optionen sind VP8, H264 oder VP9, wobei die Verwendbarkeit je nach Art der Sitzung variieren kann. Standardmäßig sind alle Projekte mit VP8 als bevorzugtem Videocodec vorkonfiguriert.
Für bestehende Projekte gehen Sie bitte auf die Dashboard, wählen Sie ein Projekt aus, gehen Sie zu der Projekt-Einstellungen, Bevorzugter Videocodec Abschnitt und klicken Sie auf den Link am Ende der Benachrichtigung.

Warten Sie, bis die neuen Einstellungen wirksam werden.

Unter weitergeleitete Sitzungen (Sitzungen, die den OpenTok Media Router nutzen), handelt der Publisher mit dem OpenTok Media Router den zu verwendenden Codec aus, wobei der vom Nutzer ausgewählte Codec Vorrang hat, sofern er vom Gerät unterstützt wird.
Unter weitergeleitete Sitzungen, bei dem die Clients Streams direkt untereinander austauschen, ist der OpenTok Media Router nicht an der Aushandlung beteiligt. Jedes Publisher-Subscriber-Paar versucht, einen gemeinsamen Video-Codec zu finden, wobei der vom Benutzer ausgewählte Codec bevorzugt wird, sofern er von beiden Geräten unterstützt wird.
Als Ergebnis der Aushandlung kann der von den beiden verwendeten Videocodec von dem bevorzugten Codec abweichen, der für das Projekt festgelegt wurde.
Einstellung des bevorzugten Videocodecs über das SDK
Eine umfassende Anleitung, die alle Modi, das Verhandlungsverhalten und die Verifizierung abdeckt, finden Sie in der Bevorzugte Video Codec API des Herausgebers Leitfaden.
Mit der Publisher Preferred Video Codec API können Sie genau steuern, wie Videocodecs während der Sitzungsaushandlung priorisiert werden. Mit dieser API können Sie:
- Geben Sie eine benutzerdefinierte Prioritätsliste von Codecs an, um die Aushandlung zu beeinflussen.
- Delegieren Sie die Priorisierung an das SDK im automatischen Modus.
- Verlassen Sie sich auf die Standardwerte Ihrer Projekteinstellungen, wenn Sie nichts eingestellt haben.
Anmerkung: Diese API schränkt nicht ein, welche Codecs ausgehandelt werden dürfen. Selbst wenn Sie eine Präferenzliste festlegen, können bei Bedarf dennoch andere Codecs verwendet werden; diese werden jedoch mit geringerer Priorität berücksichtigt.
Web-SDK
export type VideoCodec = 'vp8' | 'vp9' | 'h264';
export type PreferredVideoCodecs = 'automatic' | [VideoCodec, ...VideoCodec[]];
// Default (omitted)
OT.initPublisher('div', {});
// Automatic mode
OT.initPublisher('div', {
preferredVideoCodecs: 'automatic'
});
// Manual priority order
OT.initPublisher('div', {
preferredVideoCodecs: ['vp9', 'vp8']
});
// Invalid usage (empty list)
OT.initPublisher('div', {
preferredVideoCodecs: []
}, function (err) {
if (err) {
console.error(err.name); // 'OT_INVALID_PARAMETER'
console.error(err.message); // 'preferredVideoCodecs must be "automatic" or a non-empty array of valid codec strings'
}
});
iOS-SDK
// Manual mode
OTVideoCodecPreference *pref = [OTVideoCodecPreference manualWithCodecs:@[
@(OTVideoCodecTypeVP9),
@(OTVideoCodecTypeH264),
@(OTVideoCodecTypeVP8)
]];
OTPublisherKitSettings *settings = [[OTPublisherKitSettings alloc] init];
settings.videoCodecPreference = pref;
// Automatic mode
OTVideoCodecPreference *pref = [OTVideoCodecPreference automatic];
OTPublisherKitSettings *settings = [[OTPublisherKitSettings alloc] init];
settings.videoCodecPreference = pref;
Android-SDK
// Manual mode
PublisherKit.PreferredVideoCodecs preferredVideoCodecs =
PublisherKit.PreferredVideoCodecs.manual(
new ArrayList<PublisherKit.PreferredVideoCodecs.Codec>(
List.of(PublisherKit.PreferredVideoCodecs.Codec.VP9,
PublisherKit.PreferredVideoCodecs.Codec.H264)));
Publisher publisher = new Publisher.Builder(MainActivity.this)
.preferredVideoCodecs(preferredVideoCodecs)
.build();
// Automatic mode
PublisherKit.PreferredVideoCodecs preferredVideoCodecs =
PublisherKit.PreferredVideoCodecs.automatic();
Publisher publisher = new Publisher.Builder(MainActivity.this)
.preferredVideoCodecs(preferredVideoCodecs)
.build();
Windows-SDK
// Manual mode
var pref = new PreferredVideoCodecs(new List<PreferredVideoCodecs.Codec> {
PreferredVideoCodecs.Codec.VP9,
PreferredVideoCodecs.Codec.H264,
PreferredVideoCodecs.Codec.VP8
});
builder.PreferredVideoCodecs = pref;
// Automatic mode
builder.PreferredVideoCodecs = PreferredVideoCodecs.Automatic();
// Default (uses project settings)
builder.PreferredVideoCodecs = null;
// Invalid (throws)
try {
builder.PreferredVideoCodecs = new PreferredVideoCodecs(new List<PreferredVideoCodecs.Codec>());
} catch (ArgumentException ex) {
// "Must specify at least one codec"
}
Linux und macOS SDK
// Manual mode: specify an ordered priority list of codecs
otc_publisher_settings* publisher_settings = otc_publisher_settings_new();
otc_video_codec_type codecs[] = {
OTC_VIDEO_CODEC_VP9,
OTC_VIDEO_CODEC_H264,
OTC_VIDEO_CODEC_VP8
};
otc_status status = otc_publisher_settings_set_preferred_video_codecs(
publisher_settings,
codecs,
sizeof(codecs) / sizeof(codecs[0])
);
otc_publisher_callbacks publisher_callbacks = {0};
struct otc_publisher* publisher =
otc_publisher_new_with_settings(&publisher_callbacks, publisher_settings);
// Done with settings object
otc_publisher_settings_delete(publisher_settings);
// Automatic mode: let the SDK choose priority automatically
otc_publisher_settings* publisher_settings = otc_publisher_settings_new();
otc_status status = otc_publisher_settings_set_preferred_video_codecs_automatic(
publisher_settings
);
otc_publisher_callbacks publisher_callbacks = {0};
struct otc_publisher* publisher =
otc_publisher_new_with_settings(&publisher_callbacks, publisher_settings);
// Done with settings object
otc_publisher_settings_delete(publisher_settings);
React Native SDK
Manueller Modus: Angabe einer geordneten Prioritätenliste von Codecs:
class App extends Component {
constructor(props) {
super(props);
this.publisherProperties = {
preferredVideoCodecs: ['vp9', 'vp8']
};
this.publisherEventHandlers = {
streamCreated: event => {
console.log('Publisher stream created!', event);
},
streamDestroyed: event => {
console.log('Publisher stream destroyed!', event);
}
};
}
render() {
return (
<OTSession apiKey="your-api-key" sessionId="your-session-id" token="your-session-token">
<OTPublisher
properties={this.publisherProperties}
eventHandlers={this.publisherEventHandlers}
style={{ height: 100, width: 100 }}
/>
</OTSession>
);
}
}
Automatischer Modus: Das SDK wählt die Priorität automatisch aus:
class App extends Component {
constructor(props) {
super(props);
this.publisherProperties = {
preferredVideoCodecs: 'automatic'
};
this.publisherEventHandlers = {
streamCreated: event => {
console.log('Publisher stream created!', event);
},
streamDestroyed: event => {
console.log('Publisher stream destroyed!', event);
}
};
}
render() {
return (
<OTSession apiKey="your-api-key" sessionId="your-session-id" token="your-session-token">
<OTPublisher
properties={this.publisherProperties}
eventHandlers={this.publisherEventHandlers}
style={{ height: 100, width: 100 }}
/>
</OTSession>
);
}
}
Es ist wichtig zu verstehen, dass der endgültige Videocodec je nach Ergebnis der Verhandlungsphase vom bevorzugten Codec abweichen kann.
Unterstützte Codecs bei OpenTok
In den folgenden Tabellen sind die Funktionen der Echtzeit-Videocodecs der unterstützten OpenTok-Endpunkte aufgeführt. Beachten Sie, dass fast alle Geräte über einen H.264-Decoder für gestreamte Filme verfügen; die nachstehenden Tabellen konzentrieren sich jedoch auf die Funktionen der Geräte im Bereich der Echtzeit-Videocodecs (Kodierung und Dekodierung).
| Desktop-Browser | VP8 | H.264 | VP9 |
|---|---|---|---|
| Chrom | Ja | Ja | Ja |
| Firefox | Ja | Ja | Ja |
| Safari | Ja 1 | Ja | Ja 2 |
| Kante | Ja | Ja | Ja |
| 1 VP8 ist in Safari 12.1 und höher verfügbar, das im Lieferumfang von macOS 10.14.4 enthalten ist und auch für macOS 10.13.6 und 10.12.6 erhältlich ist. | |||
| 2 VP9 ist in Safari 15 und höher verfügbar und wird nur auf Geräten mit Hardware-Decodierung (wie beispielsweise dem M3 MacBook Pro) unterstützt. |
| Mobile Browser | VP8 | H.264 | VP9 |
|---|---|---|---|
| Chrome auf Android | Ja | Teil 1 | Ja |
| Firefox auf Android | Ja | Ja | Ja |
| Mobile Safari | Ja 2 | Ja | Ja 3 |
| Chrome/Firefox auf iOS | Ja | Ja | Ja 4 |
| WebView Android | Ja | Teil 5 | Ja |
| WebView unter iOS | Ja 6 | Ja | Ja 7 |
| 1 Chrome auf Android unterstützt H.264 nur auf Geräten mit Qualcomm- und Exynos-Chipsätzen, auf denen Chrome 65 oder höher installiert sein muss. | |||
| 2 VP8 ist in Safari unter iOS 12.2 und höher verfügbar. | |||
| 3 VP9 ist in Safari 15 und höher verfügbar und wird nur auf Geräten mit Hardware-Decodierung (wie beispielsweise dem iPhone 15 Pro) unterstützt. | |||
| 4 VP9 ist ab iOS 17 verfügbar und wird nur auf Geräten mit Hardware-Decodierung (wie beispielsweise dem iPhone 15 Pro) unterstützt. | |||
| 5 WebView für Android unterstützt H.264 nur auf Geräten mit Qualcomm- und Exynos-Chipsätzen und erfordert Chrome 65 oder höher. | |||
| 6 VP8 ist ab iOS 12.2 verfügbar. | |||
| 7 VP9 ist unter iOS 15 und höher verfügbar und wird nur auf Geräten mit Hardware-Decodierung (wie beispielsweise dem iPhone 15 Pro) unterstützt. |
| Native SDKs | VP8 | H.264 | VP9 ** |
|---|---|---|---|
| iOS SDK (2.12+) | Ja | Ja | Ja |
| Android SDK (2.13+) | Ja | Ja für die meisten Geräte * | Ja |
| Windows SDK (2.13+) | Ja | Ja | Ja |
| Linux-SDK | Ja | Nein | Ja |
| macOS-SDK | Ja | Ja *** | Ja |
| * Hardware-H.264 wird auf Geräten unterstützt, die Qualcomm- und Exynos-Chipsätze sowie eine Untergruppe von HiSilicon- und MediaTek-Chipsätzen enthalten. Fallback zu Software H.264 wird auf Android M oder höher unterstützt. | |||
| ** Für die Unterstützung von VP9 ist Version 2.27 oder höher der nativen OpenTok-Client-SDKs (für Android, iOS, macOS, Linux und Windows) erforderlich. | |||
| *** Für die H.264-Unterstützung ist Version 2.29 oder höher des OpenTok-Client SDK für macOS erforderlich. |
Unterstützung von Codec-Funktionen auf allen OpenTok-Endpunkten
| Codec/Endpunkt | Chrom | Android Chrome | Firefox | Safari | Kante | WebView Android | WebView unter iOS | iOS-SDK | Android-SDK | Windows-SDK | macOS-SDK | Linux-SDK |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VP8 | ||||||||||||
| H.264 | 75% (*) | 75% (*) | 99% (*) | |||||||||
| VP9 | (**) | (**) | ||||||||||
| VP8 skalierbares Video | ||||||||||||
| Skalierbares H.264-Video | ||||||||||||
| VP9 skalierbares Video | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) |
* Prozentsatz der Android-Geräte, die den Codec unterstützen ** VP9 wird in Safari ab Version 15 (Desktop und iOS) sowie in WebView unter iOS 15+ unterstützt, jedoch nur auf kompatiblen Geräten mit Hardware-Kodierung, wie dem MacBook M3 und dem iPhone 15 Pro. *** Weitere Informationen finden Sie unter diese Dokumentation. VP9 wird von Firefox unterstützt, skalierbare Videos hingegen nicht. Die Unterstützung für skalierbare Videos durch Hardware und Software ist nicht auf allen Geräten verfügbar.
Erkennung der Codec-Unterstützung in Clients
Nicht alle Android-Geräte unterstützen den H.264-Codec, und ältere Versionen von Safari unterstützen VP8 nicht. OpenTok.js und das OpenTok Android SDK enthalten Methoden zur Überprüfung der vom Client unterstützten Codecs.
Erkennen der vom Browser unterstützten Codecs (OpenTok.js)
OT.getSupportedCodecs() Die Methode gibt ein Promise zurück, das (im Erfolgsfall) mit einem Objekt aufgelöst wird, das zwei Eigenschaften besitzt: „videoDecoders“, ein Array der unterstützten Videocodecs für die Dekodierung, und „videoEncoders“, ein Array der unterstützten Videocodecs für die Kodierung.
Mit dem folgenden Beispiel wird die Liste der unterstützten Codecs für die Kodierung und Dekodierung von Videoströmen abgerufen:
(async () => {
try {
const supportedCodecs = await OT.getSupportedCodecs();
if (supportedCodecs.videoEncoders.indexOf('H264') < 0 && supportedCodecs.videoDecoders.indexOf('H264') < 0) {
// They do not support encoding or decoding H264 let's tell them to use a different browser
}
} catch(err) {
console.log(err);
}
})();
Erkennung von unterstützten Codecs mit dem Android SDK
MediaUtils.SupportedCodecs.getSupportedCodecs(context) gibt ein MediaUtils.SupportedCodecs Objekt mit zwei Eigenschaften: videoDecoders, eine ArrayList der unterstützten Videocodecs (definiert durch die MediaUtils.VideoCodecType Klasse) für die Dekodierung sowie „videoEncoders“, eine ArrayList der unterstützten Videocodecs (definiert durch die Klasse „MediaUtils.VideoCodecType“) für die Kodierung.
Mit dem folgenden Beispiel wird die Liste der unterstützten Codecs für die Kodierung und Dekodierung von Videoströmen abgerufen:
MediaUtils.SupportedCodecs supportedCodecs =
MediaUtils.SupportedCodecs.getSupportedCodecs(context);
if (supportedCodecs.videoEncoders.indexOf(MediaUtils.VideoCodecType.VIDEO_CODEC_H264) < 0
&& supportedCodecs.videoDecoders.indexOf(MediaUtils.VideoCodecType.VIDEO_CODEC_H264) < 0)
{
// The device does not support encoding or decoding H264.
}
Aspekte, die bei der Auswahl des bevorzugten Echtzeit-Videocodecs zu berücksichtigen sind
Interoperabilität
Der größte Interoperabilitätskonflikt betrifft Android-Geräte, ältere Versionen von Safari und Linux. VP8 funktioniert auf allen Android-Geräten, sowohl in Chrome für Android als auch mit dem OpenTok-Android-SDK, doch die Unterstützung des H.264-Codecs ist auf Android nicht flächendeckend vorhanden. Ältere Versionen von Safari bieten keine Unterstützung für den VP8-Codec. Das Linux-SDK unterstützt H.264 nicht.
Größe der Sitzung
H.264, VP8 und VP9 eignen sich gut für Endgeräte in kleinen Sitzungen (beispielsweise mit ein bis drei Teilnehmern). Da H.264 jedoch keine Unterstützung für „Scalable Video“ bietet, empfehlen wir diesen Codec nicht für große Sitzungen.
Qualität der Videos
Da auf fast allen Endgeräten dieselbe VP8-Videocodec-Implementierung verwendet wird, ist die Qualität in etwa gleich. VP8 funktioniert gut bei niedrigeren Bitraten. Darüber hinaus ist „OpenTok Scalable Video“ mit VP8 verfügbar. „Scalable Video“ verbessert die Videoqualität in größeren Sitzungen erheblich.
Die Qualität von H.264 variiert je nach Gerät, da die Umsetzung von H.264 unterschiedlich ausfällt. Zudem haben wir Qualitätsunterschiede festgestellt, die von der auf dem Gerät verwendeten Betriebssystemversion abhängen. Bei niedrigeren Bitraten ist die Qualität von H.264 im Allgemeinen nicht so gut wie die von VP8.
H.264 funktioniert gut auf iOS-Geräten, da diese eine gute Unterstützung für H.264-Hardwarebeschleunigung bieten. Dies reduziert die CPU-Last und verbessert die Akkulaufzeit.
VP9 bietet bei gleicher Bitrate eine bessere Videoqualität als VP8. Die Qualitätsverbesserungen können jedoch eine höhere CPU-Auslastung als bei VP8 erfordern.
Beispielszenarien
Hier sind die empfohlenen Videocodecs für einige Beispielszenarien:
-
Verwenden Sie in OpenTok-Sitzungen mit zwei oder drei Teilnehmern, bei denen die Kompatibilität mit älteren Versionen von Safari entscheidend ist, den H.264-Videocodec.
-
Verwenden Sie in OpenTok-Sitzungen mit zwei oder drei Teilnehmern, an denen ausschließlich iOS-Geräte beteiligt sind, den H.264-Videocodec, um die Vorteile der Hardwarebeschleunigung zu nutzen.
-
Bei Webinaren und Veranstaltungen in großen Kursräumen sollte der VP8-Codec verwendet werden, um die Vorteile der OpenTok-Funktion „Scalable Video“ zu nutzen.
-
Verwenden Sie in OpenTok-Sitzungen, bei denen die Unterstützung aller Android-Geräte von entscheidender Bedeutung ist, den VP8-Codec.
-
Bei OpenTok-Sitzungen mit zwei Teilnehmern sollten Sie die Verwendung des VP9-Videocodecs in Betracht ziehen.
Bekannte Probleme
VP9- und SIP-Verbindung
VP9 wird in Sitzungen, die Folgendes enthalten, nicht unterstützt: SIP Teilnehmer. Wenn VP9 als bevorzugter Videocodec für das Projekt festgelegt ist, können SIP-Teilnehmer kein Video empfangen, obwohl sie weiterhin Video senden können. Verwenden Sie stattdessen VP8 oder H.264 für Sitzungen, die SIP Interconnect nutzen.
WebRTC-Teilnehmer erhalten das von SIP-Teilnehmern veröffentlichte Video im VP8-Format, unabhängig davon, welcher Videocodec für das Projekt als bevorzugt festgelegt wurde.