Stratégie de mise en mémoire tampon d’ExoPlayer
Version d’ExoPlayer étudiée : 2.9.6
Les classes implémentant l’interface LoadControl définissent la stratégie de mise en mémoire tampon d’ExoPlayer. La stratégie de mise en mémoire tampon répond à des questions telles que :
- doit-on charger plus de données média ?
- a-t-on assez de données média pour commencer la lecture ?
La stratégie de mise en mémoire tampon n’est pas responsable de la gestion des tampons ou du téléchargement des données média (c’est le MediaSource), ou de la lecture des données média (c’est le Renderer). La stratégie de mise en mémoire tampon est agnostique au format du média lu et n’a qu’un rôle « consultatif ». Il peut arriver qu’ExoPlayer « demande » au LoadControl si de nouvelles données média doivent être chargées, et ignore la réponse (par exemple, ExoPlayer est déjà en train de télécharger des données média).
ExoPlayer est livré avec une implémentation par défaut, DefaultLoadControl. Il s’agit d’une implémentation personnalisable de l’interface LoadControl.
DefaultLoadControl peut être utilisé pour configurer, par exemple :
- Combien de millisecondes (ms) de données média ExoPlayer doit mettre en mémoire tampon avant de commencer la lecture (appelé bufferForPlaybackMs). ExoPlayer commencera la lecture dès qu’il disposera d’au moins bufferForPlaybackMs de données média, même si ExoPlayer n’a pas entièrement mis en mémoire tampon le segment complet.
- La quantité minimale de données média mises en mémoire tampon (en ms) avant qu’ExoPlayer ne commence à charger davantage de données (appelée minBufferMs).
- La quantité maximale de données multimédia (en ms) qu’ExoPlayer doit mettre en mémoire tampon avant de s’arrêter pour en charger d’autres (dénommé maxBufferMs).
- Le nombre de millisecondes de données multimédia qu’ExoPlayer doit mettre en mémoire tampon avant de relancer la lecture après un événement de rebuffage (dénommé bufferForPlaybackAfterRebufferMs).
DefaultLoadControl a des valeurs par défaut pour chacun de ces paramètres. Dans la version 2.9.6, ces valeurs sont :
bufferForPlaybackMs |
|
minBufferMs |
|
maxBufferMs |
|
bufferForPlaybackAfterRebufferMs |
Cependant, les valeurs varient d’une version d’ExoPlayer à l’autre. Par exemple, entre ExoPlayer v2.7.3 et v2.8.0, le maxBufferMs pour les flux vidéo est passé de 30 secondes à 50 secondes.
L’architecture modulaire d’ExoPlayer vous permet également d’implémenter votre propre stratégie de mise en mémoire tampon (qui implémente l’interface LoadControl) et de la brancher sur ExoPlayer. Mais c’est un sujet pour un autre billet.
Abaisser le temps de démarrage
Dans ExoPlayer, il est facile de configurer la quantité de données média nécessaires avant de lancer la lecture. Dans la première partie de cette série de blogs, nous avons souligné l’importance du temps de démarrage en tant que métrique de la qualité d’expérience. Un rapport publié par Akamai en 2016 a révélé que » les spectateurs commenceront à abandonner une vidéo si le démarrage prend plus de deux secondes pour commencer la lecture et pour chaque seconde de retard supplémentaire, environ 6 % de l’audience supplémentaire quitte. avec un retard de 10 secondes, près de la moitié de l’audience est partie « .
La version 2.9.6 d’ExoPlayer requiert par défaut 2,5 secondes de données média mises en mémoire tampon avant de lancer la lecture. Il est possible d’abaisser le temps de démarrage en exigeant moins de données à mettre en mémoire tampon. D’une part, l’abaissement de la valeur de mise en mémoire tampon des données média entraînerait une diminution du temps de démarrage de la vidéo, cependant l’inconvénient est que cela pourrait également entraîner une augmentation des métriques de rebuffing au démarrage.
Dans la première partie de cette série de blogs, nous avons utilisé un graphique radar pour visualiser l’impact des différents compromis sur les 5 métriques de QoE. Le graphique ci-dessous montre l’impact de l’abaissement de la quantité minimale requise de données média avant de lancer la lecture.
Puisque la valeur par défaut de bufferForPlaybackMs de 2,5 secondes est une valeur conservatrice, nous pensons que c’est un bon choix de l’abaisser.
Le graphique ci-dessous montre l’impact sur le temps de démarrage pour un flux de 3 Mbps lorsqu’on fait varier la valeur de cette option de configuration (sans tenir compte du temps d’aller-retour vers le serveur, ni du fait que le serveur doive aller chercher le contenu ailleurs). Par exemple, sur une connexion de 4 Mbps qui lit un flux de 3 Mbps, configurer ExoPlayer pour commencer la lecture après avoir mis en mémoire tampon 1,5s de données média signifie que le temps de démarrage théorique sera de 1,1s, au lieu des 1,9s avec la configuration par défaut qui consiste à mettre en mémoire tampon 2,5s de données média.
La section suivante parle de la façon de configurer ExoPlayer pour diminuer le temps de démarrage et la latence d’agitation des mains. Si vous n’êtes pas familier avec ExoPlayer, nous vous recommandons de suivre d’abord le Codelabs de Google sur le streaming multimédia avec ExoPlayer.
Configuration du DefaultLoadControl
En supposant que vous créez votre instance ExoPlayer avec l’implémentation LoadControl par défaut en utilisant le code suivant (ou similaire):
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
new DefaultLoadControl())
Vous pouvez configurer le DefaultLoadControl en utilisant un DefaultLoadControl.Builder:
/* Instancier un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder();
/* Millisecondes de données média mises en mémoire tampon avant le début ou la reprise de la lecture. */
final long loadControlStartBufferMs = 1500;
Configurer le nouveau DefaultLoadControl pour utiliser notre paramètre pour le nombre de Millisecondes de données média qui doivent être mises en mémoire tampon avant que la lecture ne commence ou ne reprenne après un événement d’action utilisateur.
builder.setBufferDurationMs(
DefaultLoadControl.DEFAULT MAX BUFFER MS,
loadControlStartBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Construire l'instance réelle de DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instancier ExoPlayer avec notre DefaultLoadControl configuré */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(), loadControl);
Baisser les métriques de rebuffage pour le contenu VOD
En plus de configurer les paramètres qui conduisent à un temps de démarrage plus faible, vous pouvez configurer le DefaultLoadControl pour établir la quantité de données média à mettre en mémoire tampon, ce qui peut avoir un impact sur les métriques de rebuffage pour le contenu VOD.
ExoPlayer v2.9.6 chargera par défaut 50 secondes de données média dans son tampon interne s’il le peut (le paramètre maxBufferMs). Dans le cas du contenu VOD, l’augmentation de cette valeur donnera au lecteur plus de place pour gérer les fluctuations de la bande passante du réseau et des métriques de rebuffage plus faibles ; l’inconvénient est que cela augmentera également l’utilisation de la mémoire d’ExoPlayer. Il est important de maintenir une faible utilisation de la mémoire sur les appareils bas de gamme. Un autre inconvénient est le gaspillage de bande passante en cas d’arrêt prématuré de la lecture.
Pour trouver la valeur qui fonctionne le mieux pour votre configuration de contenu VOD, nous vous recommandons de faire des tests A/B avec différentes valeurs de l’option de configuration pour trouver celle qui donne un bon compromis entre les taux de rebuffage et l’utilisation de la mémoire. Nous vous recommandons d’être conservateur en augmentant la valeur à, par ex, 60 secondes initialement pour savoir si cela fournit une différence matérielle pour les métriques de rebuffage.
Configuration du DefaultLoadControl
Nous supposons que vous créez votre instance ExoPlayer avec l’implémentation du LoadControl par défaut (comme indiqué dans la section précédente sur la réduction du temps de démarrage – Configuration du DefaultLoadControl).
Vous pouvez configurer le DefaultLoadControl en utilisant un DefaultLoadControl.Builder:
/* Instancier un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/* Quantité maximale de données média à mettre en mémoire tampon (en millisecondes). */
final long loadControlMaxBufferMs = 60000;
/*Configurer le DefaultLoadControl pour utiliser notre paramètre pour le nombre
de millisecondes de données média à mettre en mémoire tampon. */
builder.setBufferDurationsMs(
DefaultLoadcontrol.DEFAULT MIN BUFFER MS,
loadControlMaxBufferMs,
/* Pour réduire le temps de démarrage, modifiez également la ligne ci-dessous */
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
/* Construire l'instance réelle de DefaultLoadControl */
DefaultLoadControl loadControl = builder.createDefaultLoadControl();
/* Instancier ExoPlayer avec notre DefaultLoadControl configuré */
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(
new DefaultRenderersFactory(this),
new DefaultTrackSelector(),
loadControl);
Dans le cas où minBufferMs et maxBufferMs ont des valeurs différentes, ExoPlayer aura un comportement éclaté en remplissant le tampon. ExoPlayer mettra en mémoire tampon jusqu’à ce qu’il remplisse son tampon avec maxBufferMs de données média, puis attendra qu’il diminue jusqu’à minBufferMs (principalement applicable à la VOD). Une fois que le niveau de la mémoire tampon tombe en dessous de minBufferMs de données média, ExoPlayer recommencera à charger des données média jusqu’à ce qu’il ait une mémoire tampon d’une valeur de maxBufferMs de données média. Un tel comportement en rafale peut entraîner des problèmes de rebuffing. Il s’agit du comportement par défaut dans ExoPlayer v2.9.6 et antérieures, car ces valeurs diffèrent. Dans la v2.9.6, minBufferMs a une valeur par défaut de 15000 et maxBufferMs est de 50000.
Pour réduire encore plus les risques de rebuffage, nous recommandons de maintenir en permanence une grande mémoire tampon dans ExoPlayer, en définissant minBufferMs à la même valeur que maxBufferMs. L’équipe d’ExoPlayer a mené des expériences et a constaté que le fait de définir minBufferMs à la même valeur que maxBufferMs (et donc de changer le comportement de mise en mémoire tampon de bursty à drip-style) réduisait considérablement les événements de rebuffing, tout en n’augmentant que légèrement l’utilisation de la batterie. En fait, à partir de la v2.10, ExoPlayer a pour le cas d’utilisation vidéo le minBufferMs par défaut égal à maxBufferMs et fixé à 50s.
Comment configurer le DefaultLoadControl en utilisant un DefaultLoadControl.Builder:
/* Instancier un DefaultLoadControl.Builder. */
DefaultLoadControl.Builder builder = new
DefaultLoadControl.Builder();
/*Combien de millisecondes de données média à mettre en mémoire tampon à tout moment. */
final long loadControlBufferMs = DefaultloadControl.MAX_BUFFER_MS ; /* C'est 50000 millisecondes dans ExoPlayer 2.9.6 */
/* Configurer le DefaultLoadControl pour utiliser la même valeur pour */
builder.setBufferDurationMs(
loadControlBufferMs,
loadControlBufferMs,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS);
Summary
LoadControl est le point d’entrée de la stratégie de mise en mémoire tampon d’ExoPlayer. ExoPlayer est livré avec une implémentation par défaut, mais configurable, de l’interface LoadControl qui devrait être suffisante pour la plupart des cas d’utilisation.
Sur la base des discussions jusqu’à présent, voici un récapitulatif rapide des recommandations :
- Pour réduire le temps de démarrage, diminuez la valeur de bufferForPlaybackMs ; effectivement, en diminuant la quantité minimale de données média mises en mémoire tampon avant de commencer la lecture. Cela présente l’inconvénient d’augmenter potentiellement le nombre d’événements de rebuffing.
- Pour réduire les métriques de rebuffing pour le contenu VOD, augmentez la valeur de maxBufferMs ; augmentant effectivement la quantité maximale de données média mises en mémoire tampon. Cependant, gardez à l’esprit que cela peut avoir un impact négatif sur les appareils bas de gamme.
- Pour réduire les métriques de rebuffing, définissez minBufferMs et maxBufferMs à la même valeur. Cela changera le comportement d’ExoPlayer d’une mise en mémoire tampon en rafale à une mise en mémoire tampon au goutte à goutte.
Nous tenons à remercier nos collègues Christian Worm Mortensen et Laust Brock-Nannestad pour leurs commentaires lors de la rédaction de ce billet.
Dans le prochain billet de blog, nous examinerons la stratégie de sélection du débit binaire d’ExoPlayer. Restez à l’écoute !