ExoPlayer est compatible avec le protocole HLS avec plusieurs formats de conteneurs. Le contenu audio et formats d'échantillon vidéo doivent également être acceptés (consultez les exemples de formats). Mer d'encourager les producteurs de contenu HLS à générer des flux HLS de haute qualité. tel que décrit cliquez ici.
Fonctionnalité | Compatible | 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 de code AES-128 | NON | |
Widevine | OUI | API 19 ou versions ultérieures (schéma "cenc") et API 25+ (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 indices de préchargement | OUI | Sauf pour les plages d'octets dont la longueur n'est pas définie |
Lecture en direct | ||
Lecture en direct régulière | OUI | |
HLS à faible latence (Apple) | OUI | |
HLS à faible latence (communauté) | NON | |
Common Media Client Data (CMCD) | OUI | Guide d'intégration |
Utilisation de MediaItem
Pour lire un flux HLS, vous devez dépendre du module HLS.
Kotlin
implementation("androidx.media3:media3-exoplayer-hls:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer-hls:1.4.1"
Vous pouvez ensuite créer un MediaItem
pour un URI de playlist HLS et le transmettre à
joueur.
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
contenus.
L'URI de l'élément multimédia peut renvoyer vers une playlist de contenus multimédias ou vers une multivariante.
la playlist. Si l'URI pointe vers une playlist de multivariantes qui déclare plusieurs
#EXT-X-STREAM-INF
, ExoPlayer s'adapte automatiquement
en tenant compte à la fois de la bande passante disponible et des capacités de l'appareil.
Utilisation de HlsMediaSource
Pour plus d'options de personnalisation, vous pouvez créer un HlsMediaSource
et le transmettre
directement au lecteur au lieu d'une 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 HLS, vous devez caster l'objet renvoyé au format HlsManifest
. La
Le rappel onTimelineChanged
de Player.Listener
est également appelé chaque fois
le fichier manifeste est chargé. Cela se produira une fois pour
les contenus à la demande et
peut-être plusieurs fois
pour le contenu en direct. L'extrait de code suivant montre comment une application
peut faire quelque chose
dès 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 vous propose plusieurs façons d'adapter l'expérience de lecture à votre besoins de votre application. Consultez la page Personnalisation pour obtenir des exemples.
Désactiver la préparation sans fragment
Par défaut, ExoPlayer utilise la préparation sans blocs. Cela signifie qu'ExoPlayer
utilise uniquement les informations de la playlist de multivariantes pour préparer le
stream, qui fonctionne si les balises #EXT-X-STREAM-INF
contiennent le CODECS
.
Vous devrez peut-être désactiver cette fonctionnalité si vos segments multimédias contiennent des données
les pistes de sous-titres qui ne sont pas déclarées dans la playlist de multivariantes avec une balise
Balise #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
. Sinon, ces pistes de sous-titres
ne seront ni détectés, ni lus. Vous pouvez désactiver la préparation sans bloc dans le
HlsMediaSource.Factory
, comme indiqué dans l'extrait suivant. Notez que cette
augmente le temps de démarrage, car ExoPlayer doit télécharger un segment multimédia pour
découvrir ces pistes supplémentaires. Il est préférable de déclarer
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 du contenu HLS de haute qualité
Pour exploiter tout le potentiel d'ExoPlayer, suivez certaines consignes pour améliorer votre contenu HLS. Lisez notre article sur Medium sur la lecture HLS dans ExoPlayer pour obtenir une explication complète. Les points essentiels sont les suivants:
- Utilisez des durées de segment précises.
- Utiliser un flux multimédia continu d'éviter les modifications de la structure média sur segments.
- Utilisez la balise
#EXT-X-INDEPENDENT-SEGMENTS
. - Préférez les flux démuxés par rapport aux fichiers qui incluent à 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
. - Prévoyez une longue période de diffusion. Une minute ou plus, c'est bien.