Codecs vidéo
À propos des codecs vidéo pris en charge par OpenTok
La plateforme OpenTok s'appuie sur le protocole WebRTC et sur les codecs vidéo en temps réel pris en charge par ce dernier. Elle prend notamment en charge les codecs vidéo VP8, VP9 et H.264.
Les flux utilisent le codec VP8, qui est pris en charge par tous les clients, sauf si vous définissez un codec préféré pour le projet auquel appartient la session (voir Définition du codec vidéo préféré pour un projet.)
Au sein du vaste écosystème d'appareils et de navigateurs pris en charge par OpenTok, les niveaux de prise en charge des codecs vidéo en temps réel VP8, VP9 et H.264 varient. Certains terminaux prennent en charge tous les codecs vidéo, tandis que d'autres n'en prennent en charge qu'un seul. Le choix du codec à privilégier dépendra du type d'application que vous développez ainsi que des types de navigateurs et d'appareils que vos utilisateurs finaux utiliseront.
Qu'est-ce qu'un codec vidéo ?
Un codec vidéo se compose de deux éléments : un encodeur et un décodeur. Il permet d'encoder (de compresser) les images vidéo numériques provenant d'une webcam en un flux de données binaires pouvant être transmis sur un réseau. Il peut également recevoir un flux de données binaires et le décoder (décompresser) pour obtenir un flux d'images vidéo brutes pouvant être affichées à l'écran. Le mécanisme d'encodage et de décodage de la vidéo est défini par la norme du codec. Dans le cadre de cette page, nous allons aborder deux normes très répandues : VP8 et H.264.
VP8 vs H.264
Le codec vidéo en temps réel VP8 est un codec logiciel. Il fonctionne bien à des débits binaires faibles et est un codec vidéo abouti dans le contexte de WebRTC. En tant que codec logiciel, il peut être instancié autant de fois que nécessaire par l'application, dans les limites de la mémoire et du processeur. Le codec VP8 prend en charge le OpenTok : une solution vidéo évolutive Vidéo fonctionnalité, ce qui signifie qu’elle fonctionne bien lors de sessions à grande échelle avec les navigateurs et appareils pris en charge.
Le codec vidéo en temps réel H.264 est disponible sous forme matérielle et logicielle, selon l'appareil. Il s'agit d'un codec relativement récent dans le contexte du WebRTC, bien qu'il soit utilisé depuis longtemps pour la diffusion en continu de films et de clips vidéo sur Internet. La prise en charge matérielle du codec signifie que le processeur central de l'appareil n'a pas à fournir autant d'efforts pour traiter la vidéo, ce qui réduit la charge du processeur. Le nombre d'instances matérielles dépend de l'appareil, iOS offrant la meilleure prise en charge. Étant donné que le H.264 est un nouveau codec pour WebRTC et que chaque appareil peut avoir une implémentation différente, la qualité peut varier. Ainsi, le H.264 peut s’avérer moins performant à des débits binaires faibles par rapport au VP8. Le H.264 n’est pas bien adapté aux sessions de grande envergure, car il ne prend pas en charge la fonctionnalité « Scalable Video » d’OpenTok.
VP9 vs VP8
Le codec VP9 en temps réel est un codec relativement récent. Il bénéficie d'un soutien croissant de la part des éditeurs de navigateurs et des fabricants de matériel. Malgré cette prise en charge grandissante, il n'est pas encore aussi répandu que les autres codecs.
Le codec VP9, tout comme le VP8, fonctionne bien à des débits binaires inférieurs à ceux du H.264. De plus, le VP9 nécessite encore moins de bande passante que le VP8 pour encoder la vidéo. Cependant, ces améliorations en matière de compression s'accompagnent d'un inconvénient : l'encodage et le décodage sollicitent davantage le processeur que le VP8.
Le codec VP9 prend en charge Codage vidéo évolutif en sessions acheminées. Pour plus d'informations, voir Codage vidéo évolutif VP9 pour les sessions acheminées.
Définition du codec vidéo préféré pour un projet
Vous pouvez définir le codec vidéo de votre choix pour un projet sur la page « Projet » de votre Video API Account. Les options disponibles sont VP8, H264 ou VP9, mais leur applicabilité peut varier en fonction du type de session. Par défaut, tous les projets sont préconfigurés avec VP8 comme codec vidéo par défaut.
Pour les projets existants, rendez-vous sur la page tableau de bord, sélectionnez un projet, accédez à la Paramètres du projet, Codec vidéo préféré section, puis cliquez sur le lien figurant à la fin de la notification.

Attendez que les nouveaux paramètres soient pris en compte.

En sessions acheminées (sessions utilisant le routeur multimédia OpenTok), l'éditeur négociera avec le routeur multimédia OpenTok le codec à utiliser, en donnant la priorité au codec sélectionné par l'utilisateur lorsque celui-ci est pris en charge par l'appareil.
En sessions relayées, lorsque les clients s'échangent directement des flux, le routeur multimédia OpenTok n'intervient pas dans la négociation. Chaque paire émetteur-abonné tente de trouver un codec vidéo commun, en privilégiant le codec sélectionné par l'utilisateur lorsque celui-ci est pris en charge par les deux appareils.
À l'issue de la négociation, le codec vidéo utilisé par le duo peut différer du codec défini comme préféré pour le projet.
Définition du codec vidéo préféré via le SDK
Pour un guide complet couvrant tous les modes, les comportements de négociation et la vérification, consultez le API de codecs vidéo préférés de l'éditeur guide.
L'API Codecs vidéo préférés de l'éditeur vous permet de contrôler finement la manière dont les codecs vidéo sont prioritaires lors de la négociation de la session. les codecs vidéo sont prioritaires lors de la négociation de la session. Avec cette API, vous pouvez :
- Spécifier une liste de priorité personnalisée de codecs pour influencer la négociation.
- Déléguer la priorisation au SDK en mode automatique.
- Utilisez les valeurs par défaut des paramètres de votre projet si vous n'avez rien défini.
Remarque : Cette API n'impose aucune restriction quant aux codecs pouvant faire l'objet d'une négociation. Même si vous définissez une liste de préférences, d'autres codecs peuvent toujours être utilisés si nécessaire, mais ils seront pris en compte avec une priorité moindre.
SDK Web
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'
}
});
SDK iOS
// 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;
SDK Android
// 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();
SDK Windows
// 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"
}
SDK Linux et macOS
// 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);
SDK React Native
Mode manuel : spécifier une liste de codecs classés par ordre de priorité :
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>
);
}
}
Mode automatique : permet au SDK de choisir automatiquement la priorité :
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>
);
}
}
Il est important de comprendre que le codec vidéo final peut différer du codec privilégié en fonction du résultat de la phase de négociation.
Prise en charge des codecs OpenTok
Les tableaux suivants répertorient les capacités en matière de codecs vidéo en temps réel des terminaux OpenTok pris en charge. Veuillez noter que la quasi-totalité des appareils prennent en charge le décodeur H.264 pour les films diffusés en streaming ; toutefois, les tableaux ci-dessous se concentrent sur les capacités de ces appareils en matière de codecs vidéo en temps réel (encodage et décodage).
| Navigateurs de bureau | VP8 | H.264 | VP9 |
|---|---|---|---|
| Chrome | Oui | Oui | Oui |
| Firefox | Oui | Oui | Oui |
| Safari | Oui 1 | Oui | Oui 2 |
| Bord | Oui | Oui | Oui |
| 1 Le format VP8 est pris en charge par Safari 12.1 et versions ultérieures, fourni avec macOS 10.14.4 et également disponible pour macOS 10.13.6 et 10.12.6. | |||
| 2 Le format VP9 est disponible dans Safari 15 et versions ultérieures, et n'est pris en charge que sur les appareils dotés d'un décodeur matériel (tels que le MacBook Pro M3). |
| Navigateurs mobiles | VP8 | H.264 | VP9 |
|---|---|---|---|
| Chrome sur Android | Oui | 1re partie | Oui |
| Firefox sur Android | Oui | Oui | Oui |
| Safari mobile | Oui 2 | Oui | Oui 3 |
| Chrome/Firefox sur iOS | Oui | Oui | Oui 4 |
| WebView Android | Oui | Partie 5 | Oui |
| WebView sur iOS | Oui 6 | Oui | Oui 7 |
| 1 Sur Android, Chrome ne prend en charge le format H.264 que sur les appareils équipés de puces Qualcomm ou Exynos et nécessitant la version 65 ou une version ultérieure de Chrome. | |||
| 2 Le format VP8 est pris en charge par Safari sous iOS 12.2 et versions ultérieures. | |||
| 3 Le format VP9 est disponible dans Safari 15 et versions ultérieures, et n'est pris en charge que sur les appareils dotés d'un décodeur matériel (tels que l'iPhone 15 Pro). | |||
| 4 Le format VP9 est disponible sous iOS 17 et versions ultérieures, et n'est pris en charge que sur les appareils dotés d'un décodeur matériel (tels que l'iPhone 15 Pro). | |||
| 5 WebView pour Android ne prend en charge le format H.264 que sur les appareils équipés de puces Qualcomm ou Exynos et nécessite Chrome 65 ou une version ultérieure. | |||
| 6 VP8 est disponible sur iOS 12.2 et versions ultérieures. | |||
| 7 VP9 est disponible sur iOS 15 et versions ultérieures, et n'est pris en charge que sur les appareils dotés d'un décodage matériel (tels que l'iPhone 15 Pro). |
| SDK natifs | VP8 | H.264 | VP9 ** |
|---|---|---|---|
| SDK iOS (2.12+) | Oui | Oui | Oui |
| SDK Android (2.13+) | Oui | Oui pour la plupart des appareils * | Oui |
| SDK Windows (2.13+) | Oui | Oui | Oui |
| SDK Linux | Oui | Non | Oui |
| SDK macOS | Oui | Oui *** | Oui |
| * Le H.264 matériel est pris en charge sur les appareils contenant les puces Qualcomm et Exynos, ainsi qu'un sous-ensemble de puces HiSilicon et MediaTek. Le repli vers le H.264 logiciel est pris en charge sur Android M ou une version ultérieure. | |||
| ** La prise en charge du format VP9 nécessite la version 2.27 ou une version ultérieure des SDK du client natif OpenTok (pour Android, iOS, macOS, Linux et Windows). | |||
| *** La prise en charge du format H264 nécessite la version 2.29 ou une version ultérieure du Client SDK OpenTok pour macOS. |
Prise en charge des fonctionnalités de codec sur l'ensemble des terminaux OpenTok
| Codec/Terminal | Chrome | Android Chrome | Firefox | Safari | Bord | WebView Android | WebView sur iOS | SDK iOS | SDK Android | SDK Windows | SDK macOS | SDK Linux |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VP8 | ||||||||||||
| H.264 | 75% (*) | 75% (*) | 99% (*) | |||||||||
| VP9 | (**) | (**) | ||||||||||
| Vidéo évolutive VP8 | ||||||||||||
| Vidéo évolutive H.264 | ||||||||||||
| Vidéo évolutive VP9 | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) |
* Pourcentage d'appareils Android prenant en charge ce codec ** Le codec VP9 est pris en charge par Safari 15 et versions ultérieures (version bureau et iOS) ainsi que par WebView sur iOS 15 et versions ultérieures, mais uniquement sur les appareils compatibles disposant d'un encodage matériel, tels que le MacBook M3 et l'iPhone 15 Pro. *** Pour plus d'informations, consultez cette documentation. Le format VP9 est pris en charge par Firefox, mais pas la vidéo évolutive. La prise en charge matérielle et logicielle de la vidéo évolutive n'est pas disponible sur tous les appareils.
Détection de la prise en charge des codecs par les clients
Tous les appareils Android ne prennent pas en charge le codec H.264, et les anciennes versions de Safari ne prennent pas en charge le VP8. OpenTok.js et le SDK OpenTok pour Android proposent des méthodes permettant de vérifier les codecs pris en charge par le client.
Détection des codecs pris en charge par le navigateur (OpenTok.js)
OT.getSupportedCodecs() La méthode renvoie une Promise qui, en cas de réussite, est résolue avec un objet comportant deux propriétés : videoDecoders, un tableau contenant les codecs vidéo pris en charge pour le décodage, et videoEncoders, un tableau contenant les codecs vidéo pris en charge pour l'encodage.
L'exemple suivant permet d'obtenir la liste des codecs pris en charge pour le codage et le décodage des flux vidéo :
(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);
}
})();
Détection des codecs pris en charge à l'aide du SDK Android
MediaUtils.SupportedCodecs.getSupportedCodecs(context) renvoie un MediaUtils.SupportedCodecs objet comportant deux propriétés : videoDecoders, une ArrayList des codecs vidéo pris en charge (définis par le MediaUtils.VideoCodecType (classe) pour le décodage, et videoEncoders, une ArrayList des codecs vidéo pris en charge (définis par la classe MediaUtils.VideoCodecType) pour l'encodage.
L'exemple suivant permet d'obtenir la liste des codecs pris en charge pour le codage et le décodage des flux vidéo :
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.
}
Points à prendre en compte lors du choix de votre codec vidéo en temps réel préféré
Interopérabilité
Le principal problème d'interopérabilité concerne les appareils Android, les anciennes versions de Safari et Linux. Le codec VP8 fonctionne sur tous les appareils Android, aussi bien avec Chrome pour Android qu'avec le SDK OpenTok pour Android, mais la prise en charge du codec H.264 sur Android n'est pas généralisée. Les anciennes versions de Safari ne prennent pas en charge le codec VP8. Le SDK Linux ne prend pas en charge le H.264.
Taille de la session
Les codecs H.264, VP8 et VP9 peuvent convenir aux terminaux dans le cadre de petites sessions (par exemple, comptant entre un et trois participants). Cependant, le codec H.264 ne prenant pas en charge la vidéo évolutive (Scalable Video), nous ne le recommandons pas pour les sessions de grande envergure.
Qualité de la vidéo
Étant donné que la même implémentation du codec vidéo VP8 est utilisée sur la quasi-totalité des terminaux, la qualité est globalement la même. Le VP8 fonctionne bien à des débits binaires faibles. De plus, la fonctionnalité « Scalable Video » d'OpenTok est disponible avec le VP8. Cette fonctionnalité améliore considérablement la qualité vidéo lors de sessions comptant un grand nombre de participants.
La qualité du format H.264 varie d'un appareil à l'autre, car sa mise en œuvre diffère selon les appareils. De plus, nous avons constaté des différences de qualité en fonction de la version du système d'exploitation installée sur l'appareil. À des débits binaires faibles, la qualité du format H.264 est généralement inférieure à celle du format VP8.
La norme H.264 fonctionne bien sur les appareils iOS car ils prennent bien en charge l'accélération matérielle de la norme H.264. Cela réduit la charge du processeur et améliore l'autonomie de la batterie.
Le VP9 offre une meilleure qualité vidéo que le VP8 à débit binaire égal. Ces améliorations de qualité peuvent toutefois entraîner une charge plus importante pour le processeur que le VP8.
Exemples de scénarios
Voici les codecs vidéo recommandés dans quelques exemples de scénarios :
-
Dans les sessions OpenTok comptant deux ou trois participants, lorsque l'interopérabilité avec les anciennes versions de Safari est essentielle, utilisez le codec vidéo H.264.
-
Dans les sessions OpenTok réunissant deux ou trois participants et impliquant uniquement des appareils iOS, utilisez le codec vidéo H.264 afin de bénéficier de l'accélération matérielle.
-
Les webinaires et les sessions en grande salle de classe doivent utiliser le codec VP8 afin de tirer parti de la fonctionnalité « Scalable Video » d'OpenTok.
-
Dans les sessions OpenTok où la prise en charge de tous les appareils Android est essentielle, utilisez le codec VP8.
-
Dans les sessions OpenTok à deux participants, pensez à utiliser le codec vidéo VP9.
Problèmes connus
Interconnexion VP9 et SIP
Le format VP9 n'est pas pris en charge dans les sessions qui incluent SIP participants. Si le codec VP9 est défini comme codec vidéo par défaut pour le projet, les participants SIP ne pourront pas recevoir de vidéo, bien qu’ils puissent toujours en envoyer. Utilisez plutôt le codec VP8 ou H.264 pour les sessions utilisant l’interconnexion SIP.
Les participants WebRTC reçoivent la vidéo diffusée par les participants SIP au format VP8, quel que soit le codec vidéo défini comme préféré pour le projet.