ExoPlayer est compatible avec le protocole HLS avec plusieurs formats de conteneurs. Les formats d'échantillon audio et vidéo contenus doivent également être compatibles (pour en savoir plus, consultez la section Exemples de formats). Nous encourageons vivement les producteurs de contenu HLS à générer des flux HLS de haute qualité, comme décrit ici.
Fonctionnalité | Autorisé | Commentaires |
---|---|---|
Conteneurs | ||
MPEG-TS | OUI | |
FMP4/CMAF | OUI | |
ADTS (AAC) | OUI | |
MP3 | OUI | |
Sous-titres | ||
CEA-608 | OUI | |
CEA-708 | OUI | |
WebVTT | OUI | |
Métadonnées | ||
ID3 | OUI | |
SCTE-35 | NON | |
Protection du contenu | ||
AES-128 | OUI | |
Exemple d'algorithme AES-128 | NON | |
Widevine | OUI | API 19 ou version ultérieure (schéma "cenc") et version 25 ou ultérieure (schéma "cbcs") |
PlayReady SL2000 | OUI | Android TV uniquement |
Contrôle des serveurs | ||
Mises à jour delta | OUI | |
Blocage de l'actualisation de la playlist | OUI | |
Blocage du chargement des suggestions de préchargement | OUI | Sauf pour les plages d'octets dont la longueur n'est pas définie |
Lecture en direct | ||
Lecture en direct standard | OUI | |
HLS à faible latence (Apple) | OUI | |
HLS (communauté) à faible latence | NON | |
Common Media Client Data (CMCD) | OUI | Guide d'intégration |
Utiliser MediaItem
Pour lire un flux HLS, vous devez dépendre du module HLS.
Kotlin
implementation("androidx.media3:media3-exoplayer-hls:1.3.1")
Groovy
implementation "androidx.media3:media3-exoplayer-hls:1.3.1"
Vous pouvez ensuite créer un MediaItem
pour l'URI d'une playlist HLS et le transmettre au lecteur.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(hlsUri)) // Prepare the player. player.prepare()
Java
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(hlsUri)); // Prepare the player. player.prepare();
Si votre URI ne se termine pas par .m3u8
, vous pouvez transmettre MimeTypes.APPLICATION_M3U8
à setMimeType
de MediaItem.Builder
pour indiquer explicitement le type de contenu.
L'URI de l'élément multimédia peut pointer vers une playlist de contenus multimédias ou vers une playlist multivariante. Si l'URI pointe vers une playlist de multivariantes qui déclare plusieurs balises #EXT-X-STREAM-INF
, ExoPlayer s'adapte automatiquement aux variantes, en tenant compte à la fois de la bande passante disponible et des capacités de l'appareil.
Utiliser HlsMediaSource
Pour accéder à davantage d'options de personnalisation, vous pouvez créer un HlsMediaSource
et le transmettre directement au lecteur au lieu de MediaItem
.
Kotlin
// Create a data source factory. val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a HLS media source pointing to a playlist uri. val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri)) // Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the HLS media source as the playlist with a single media item. player.setMediaSource(hlsMediaSource) // Prepare the player. player.prepare()
Java
// Create a data source factory. DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a HLS media source pointing to a playlist uri. HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri)); // Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the HLS media source as the playlist with a single media item. player.setMediaSource(hlsMediaSource); // Prepare the player. player.prepare();
Accéder au fichier manifeste
Vous pouvez récupérer le fichier manifeste actuel en appelant Player.getCurrentManifest
.
Pour le HLS, vous devez caster l'objet renvoyé sur HlsManifest
. Le rappel onTimelineChanged
de Player.Listener
est également appelé chaque fois que le fichier manifeste est chargé. Cela se produira une fois pour le contenu à la demande et de nombreuses fois pour le contenu en direct. L'extrait de code suivant montre comment une application peut effectuer une action chaque fois que le fichier manifeste est chargé.
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) { val manifest = player.currentManifest if (manifest is HlsManifest) { // Do something with the manifest. } } } )
Java
player.addListener( new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { Object manifest = player.getCurrentManifest(); if (manifest != null) { HlsManifest hlsManifest = (HlsManifest) manifest; // Do something with the manifest. } } });
Personnaliser la lecture
ExoPlayer propose plusieurs façons d'adapter l'expérience de lecture aux besoins de votre application. Consultez la page Personnalisation pour voir des exemples.
Désactiver la préparation sans fragment
Par défaut, ExoPlayer utilise une préparation sans fragment. Cela signifie qu'ExoPlayer n'utilise les informations de la playlist de multivariantes que pour préparer le flux, qui fonctionne si les balises #EXT-X-STREAM-INF
contiennent l'attribut CODECS
.
Vous devrez peut-être désactiver cette fonctionnalité si vos segments multimédias contiennent des pistes de sous-titres multiplexés qui ne sont pas déclarées dans la playlist de multivariantes avec une balise #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
. Sinon, ces pistes de sous-titres ne seront pas détectées ni lues. Vous pouvez désactiver la préparation sans fragment dans le fichier HlsMediaSource.Factory
, comme indiqué dans l'extrait suivant. Notez que cela augmentera le temps de démarrage, car ExoPlayer doit télécharger un segment multimédia pour découvrir ces pistes supplémentaires. Il est donc préférable de déclarer les pistes de sous-titres dans la playlist de multivariantes.
Kotlin
val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(false) .createMediaSource(MediaItem.fromUri(hlsUri))
Java
HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(false) .createMediaSource(MediaItem.fromUri(hlsUri));
Créer un contenu HLS de haute qualité
Afin d'exploiter tout le potentiel d'ExoPlayer, vous pouvez suivre certaines consignes afin d'améliorer votre contenu HLS. Pour en savoir plus, consultez notre article de Medium sur la lecture HLS dans ExoPlayer. Voici les principaux points à retenir:
- Utilisez des durées de segment précises.
- Utilisez un flux multimédia continu et évitez de modifier la structure média entre les différents segments.
- Utilisez la balise
#EXT-X-INDEPENDENT-SEGMENTS
. - Privilégiez les flux démuxés, plutôt que les fichiers contenant à la fois de la vidéo et de l'audio.
- Incluez toutes les informations possibles dans la playlist de multivariantes.
Les consignes suivantes s'appliquent spécifiquement aux diffusions en direct:
- Utilisez la balise
#EXT-X-PROGRAM-DATE-TIME
. - Utilisez la balise
#EXT-X-DISCONTINUITY-SEQUENCE
. - Indiquer une longue fenêtre en direct. Une minute ou plus, c'est super.