Video-Codecs

Die Vonage-Plattform nutzt das WebRTC-Protokoll und die von WebRTC unterstützten Echtzeit-Video-Codecs. Insbesondere unterstützt die Vonage-Plattform VP8, VP9und H.264-Videocodecs.

Streams verwenden den VP8-Codec, der von allen Clients unterstützt wird, es sei denn, Sie legen einen bevorzugten Codec für die Anwendung fest, zu der die Sitzung gehört (siehe Einstellen des bevorzugten Videocodecs für eine Anwendung.)

Über das breite Ökosystem von Geräten und Unterstützte Browser Die VP8 wird in unterschiedlichem Maße unterstützt, VP9 und H.264-Echtzeit-Videocodecs.

Einige Endpunkte unterstützen alle Videocodecs, andere nur einen Videocodec. Je nach Art der Anwendung, die Sie erstellen, und den Browsern und Geräten, die Ihre Endbenutzer verwenden werden, wird sich die Wahl des bevorzugten Codecs ändern.

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 gesendet werden kann.

Es kann auch einen Strom von Binärdaten aufnehmen und in einen Strom von Rohvideobildern dekodieren (dekomprimieren), die auf einem Bildschirm angezeigt werden können.

Der Mechanismus für die Kodierung und Dekodierung des Videos ist der Codec-Standard, und für den Zweck dieser Seite werden wir über zwei populäre sprechen, VP8 und H.264.

VP8 vs. H.264

Der Echtzeit-Videocodec VP8 ist ein Software-Codec. Er kann gut mit niedrigeren Bitraten arbeiten und ist ein ausgereifter Videocodec im Kontext von WebRTC.

Als Software-Codec kann er so oft instanziiert werden, wie es die Anwendung innerhalb der Grenzen von Speicher und CPU benötigt. Der VP8-Codec unterstützt die Skalierbares Video Funktion, d. h. sie funktioniert gut in großen Sitzungen mit unterstützten Browsern und Geräten.

Der H.264-Echtzeitvideocodec ist je nach Gerät sowohl in Hardware- als auch in Softwareform erhältlich.

Es handelt sich um einen relativ neuen Codec im Zusammenhang mit WebRTC, obwohl er schon lange für das Streaming von Filmen und Videoclips über das Internet verwendet wird.

Die Unterstützung von Hardware-Codecs bedeutet, dass die Kern-CPU des Geräts nicht so stark arbeiten muss, um das Video zu verarbeiten, was zu einer geringeren CPU-Last 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 ist die Leistung von H.264 bei niedrigeren Bitraten im Vergleich zu VP8 möglicherweise nicht so gut. H.264 eignet sich nicht gut für große Sitzungen, da es die Funktion "Scalable Video" nicht unterstützt.

VP9 vs. VP8

Die VP9 Echtzeit-Codec ist ein relativ neuer Codec. Er wird von immer mehr Browser- und Hardware-Anbietern unterstützt. Trotz zunehmender Unterstützung ist er noch nicht so weit verbreitet wie die anderen Codecs.

Der VP9-Codec funktioniert, wie VP8, auch bei niedrigeren Bitraten als H.264. Außerdem benötigt VP9 für die Videokodierung sogar weniger Bandbreite als VP8. Die Verbesserungen bei der Komprimierung haben jedoch einen Nachteil: Die Codierung/Decodierung erfordert mehr CPU-Leistung als VP8.

Der VP9-Codec unterstützt Skalierbare Videokodierung in weitergeleitete Sitzungen. Für weitere Informationen siehe VP9 Skalierbare Videocodierung für geroutete Sitzungen.

Einstellen des bevorzugten Videocodecs für eine Anwendung

Sie können den bevorzugten Videocodec für eine Anwendung im Fenster Vonage Dashboard indem Sie Applications auswählen, dann zu Video Capabilities navigieren und schließlich auf den Abschnitt Advanced Settings zugreifen. Gültige Auswahlmöglichkeiten sind VP8, H264 oder VP9Die Anwendbarkeit kann jedoch je nach Art der Sitzung variieren. Standardmäßig sind alle Projekte mit VP8 als bevorzugtem Videocodec vorkonfiguriert.

Unter weitergeleitete Sitzungen (Sitzungen, die den Media Router verwenden), den OpenTok Media Router), handelt der Herausgeber mit dem OpenTok Media Router den zu verwendenden Codec aus, wobei der vom Benutzer gewählte Codec bevorzugt wird, sofern er vom Gerät unterstützt wird.

Unter weitergeleitete SitzungenDer OpenTok Media Router ist nicht an der Verhandlung beteiligt, da die Clients ihre Streams direkt aneinander senden. Jedes Veröffentlichungs-Abonnement-Paar versucht, einen gemeinsamen Video-Codec zu finden, wobei der vom Benutzer gewählte Codec bevorzugt wird, wenn er von beiden Geräten unterstützt wird.

Als Ergebnis der Verhandlung kann der von dem Paar verwendete Videocodec von dem für das Projekt bevorzugten Codecsatz abweichen.

Einstellung des bevorzugten Videocodecs über das SDK

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 können. Auch
Wenn Sie eine Präferenzliste festlegen, können andere Codecs bei Bedarf weiterhin verwendet werden, aber
werden sie 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);

Es ist wichtig zu wissen, dass der endgültige Videocodec je nach Ergebnis der Verhandlungsphase vom bevorzugten Codec abweichen kann.

Codec-Abdeckung

In den folgenden Tabellen sind die Echtzeit-Video-Codec-Fähigkeiten der unterstützten Endpunkte aufgeführt.

Beachten Sie, dass fast alle Geräte H.264-Decoder für gestreamte Filme unterstützen. Die folgenden Tabellen konzentrieren sich jedoch auf die Echtzeit-Video-Codec-Fähigkeiten (Codierung und Decodierung) der Geräte.

Desktop-Browser VP8 H.264 VP9
Chrom Ja Ja Ja
Firefox Ja Ja Ja
Safari Ja¹ Ja Ja²
Kante Ja Ja Ja

¹ VP8 ist in Safari 12.1+ verfügbar, das mit macOS 10.14.4 ausgeliefert wird und auch für macOS 10.13.6 und 10.12.6 verfügbar ist.

² VP9 ist in Safari 15+ verfügbar und wird nur auf Geräten mit Hardware-Decodierung (wie dem M3 Macbook Pro) unterstützt.

Mobile Browser VP8 H.264 VP9
Chrome auf Android Ja Teilweise¹ Ja
Firefox auf Android Ja Ja Ja
Mobile Safari Ja² Ja Ja³
Chrome/Firefox auf iOS - - Ja⁴
WebView Android Ja Teilweise⁵ Ja
WebView unter iOS Ja⁶ Ja Ja⁷

Chrome auf Android unterstützt H.264 nur auf Geräten mit Qualcomm- und Exynos-Chipsätzen und erfordert Chrome 65 oder höher.

² VP8 ist in Safari unter iOS 12.2+ verfügbar.

VP9 ist in Safari 15+ verfügbar und wird nur von Geräten mit Hardware-Decodierung (wie dem iPhone 15 Pro) unterstützt.

⁴ VP9 ist erst ab iOS 17 verfügbar und wird nur auf Geräten mit Hardware-Decodierung (wie dem iPhone 15 Pro) unterstützt.

⁵ WebView Android unterstützt H.264 nur auf Geräten, die Qualcomm- und Exynos-Chipsätze enthalten und Chrome 65 oder höher benötigen.

⁶ VP8 ist unter iOS 12.2+ verfügbar.

⁷ VP9 ist ab iOS 15 verfügbar und wird nur auf Geräten mit Hardware-Decodierung (wie 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.

** VP9-Unterstützung erfordert 2.27+ der nativen Client-SDKs von Vonage Video (für Android, iOS, macOS, Linux und Windows).

Hinweis: Die H264-Unterstützung erfordert Version 2.29+ des Vonage Client SDK für macOS.

Unterstützung von Codec-Funktionen an allen 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 (***) (***) (***) (***) (***) (***) (***) (***) (***) (***) (***) (***)

* Prozentualer Anteil der Android-Geräte, die den Codec unterstützen

** VP9 wird von Safari 15+ (Desktop und iOS) und WebView auf iOS 15+ unterstützt, allerdings nur auf unterstützten Geräten mit Hardware-Encoding, wie dem M3 Macbook und dem iPhone 15 Pro.

*** VP9 wird von Firefox unterstützt, skalierbares Video jedoch nicht. Hardware- und software-skalierbare Videounterstützung wird nicht auf allen Geräten unterstützt.

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 Android-SDK enthalten Methoden zur Überprüfung der unterstützten Codecs, die dem Client zur Verfügung stehen.

Erkennung von unterstützten Codecs im Browser

Die OT.getSupportedCodecs() Methode gibt ein Promise zurück, das (bei Erfolg) mit einem Objekt aufgelöst wird, das zwei Eigenschaften hat: videoDecoderseine Reihe von unterstützten Videocodecs für die Dekodierung, und videoEncoderseine Reihe von unterstützten Videocodecs für die Codierung.

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

Die MediaUtils.SupportedCodecs.getSupportedCodecs(context) gibt eine MediaUtils.SupportedCodecs Objekt, das zwei Eigenschaften hat: videoDecodersan ArrayList der unterstützten Videocodecs (definiert durch den MediaUtils.VideoCodecType-Klasse) für die Dekodierung, und videoEncodersan ArrayList der unterstützten Videocodecs (definiert durch den MediaUtils.VideoCodecType Klasse) 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 Hauptkonflikt bei der Interoperabilität betrifft Android-Geräte, ältere Versionen von Safari und Linux. VP8 funktioniert auf allen Android-Geräten, sowohl in Android Chrome als auch im Android SDK, aber die H.264-Codec-Unterstützung auf Android ist nicht allgegenwärtig. Ältere Versionen von Safari haben keine VP8-Codec-Unterstützung. Das Linux-SDK unterstützt H.264 nicht.

Größe der Sitzung

H.264, VP8 und VP9 kann für Endpunkte in kleinen Sitzungen (z. B. ein bis drei Teilnehmer) gut funktionieren. Da H.264 jedoch keine Unterstützung für Scalable Video bietet, wird die Verwendung dieses Codecs für große Sitzungen nicht empfohlen.

Qualität der Videos

Da auf fast allen Endpunkten die gleiche VP8-Video-Codec-Implementierung verwendet wird, ist die Qualität in etwa gleich. VP8 funktioniert gut bei niedrigeren Bitraten.

Darüber hinaus ist Scalable Video mit VP8 verfügbar. Scalable Video verbessert die Videoqualität bei größeren Sitzungen erheblich.

Die Qualität von H.264 variiert von Gerät zu Gerät, da die Implementierung von H.264 unterschiedlich ist.

Außerdem haben wir Qualitätsunterschiede festgestellt, die von der Version des Betriebssystems auf dem Gerät abhängen. Die Qualität von H.264 bei niedrigeren Bitraten ist im Allgemeinen nicht so gut wie 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 eine bessere Videoqualität als VP8, wenn es mit der gleichen Bitrate arbeitet. Die Qualitätsverbesserungen können jedoch eine höhere CPU-Belastung als VP8 erfordern.

Beispielszenarien

Hier sind die empfohlenen Videocodecs für einige Beispielszenarien:

  • In Sitzungen mit 2-3 Teilnehmern, bei denen die Interoperabilität mit älteren Versionen von Safari wichtig ist, sollten Sie den H.264-Videocodec verwenden.
  • In Sitzungen mit 2-3 Teilnehmern, an denen nur iOS-Geräte beteiligt sind, sollten Sie den H.264-Videocodec verwenden, um die Vorteile der Hardwarebeschleunigung zu nutzen.
  • Webinare und Sitzungen in großen Klassenzimmern sollten den VP8-Codec verwenden, um die Vorteile der skalierbaren Videofunktion zu nutzen.
  • In Sitzungen, in denen die Unterstützung aller Android-Geräte wichtig ist, sollten Sie den VP8-Codec verwenden.