L'API de la playlist est définie par l'interface Player
, qui est implémentée par
toutes les implémentations ExoPlayer
. Les playlists permettent la lecture séquentielle de plusieurs
éléments multimédias. L'exemple suivant montre comment lancer la lecture d'une playlist.
contenant deux vidéos:
Kotlin
// Build the media items. val firstItem = MediaItem.fromUri(firstVideoUri) val secondItem = MediaItem.fromUri(secondVideoUri) // Add the media items to be played. player.addMediaItem(firstItem) player.addMediaItem(secondItem) // Prepare the player. player.prepare() // Start the playback. player.play()
Java
// Build the media items. MediaItem firstItem = MediaItem.fromUri(firstVideoUri); MediaItem secondItem = MediaItem.fromUri(secondVideoUri); // Add the media items to be played. player.addMediaItem(firstItem); player.addMediaItem(secondItem); // Prepare the player. player.prepare(); // Start the playback. player.play();
Les transitions entre les éléments d'une playlist sont fluides. Il n'y a aucune exigence
qu'ils sont du même format (par exemple, une playlist peut contenir les deux
H264 et VP9). Ils peuvent même être de différents types (c'est-à-dire qu'un
contenant des vidéos, des images et des flux audio uniquement). Vous pouvez utiliser
le même MediaItem
à plusieurs reprises dans une playlist.
Modifier la playlist
Vous pouvez modifier une playlist de façon dynamique en ajoutant, déplaçant, supprimant ou remplaçant éléments multimédias. Vous pouvez le faire avant et pendant la lecture en appelant la méthode méthodes de l'API des playlists correspondantes:
Kotlin
// Adds a media item at position 1 in the playlist. player.addMediaItem(/* index= */ 1, MediaItem.fromUri(thirdUri)) // Moves the third media item from position 2 to the start of the playlist. player.moveMediaItem(/* currentIndex= */ 2, /* newIndex= */ 0) // Removes the first item from the playlist. player.removeMediaItem(/* index= */ 0) // Replace the second item in the playlist. player.replaceMediaItem(/* index= */ 1, MediaItem.fromUri(newUri))
Java
// Adds a media item at position 1 in the playlist. player.addMediaItem(/* index= */ 1, MediaItem.fromUri(thirdUri)); // Moves the third media item from position 2 to the start of the playlist. player.moveMediaItem(/* currentIndex= */ 2, /* newIndex= */ 0); // Removes the first item from the playlist. player.removeMediaItem(/* index= */ 0); // Replace the second item in the playlist. player.replaceMediaItem(/* index= */ 1, MediaItem.fromUri(newUri));
Vous pouvez également remplacer et effacer toute la playlist:
Kotlin
// Replaces the playlist with a new one. val newItems: List<MediaItem> = listOf(MediaItem.fromUri(fourthUri), MediaItem.fromUri(fifthUri)) player.setMediaItems(newItems, /* resetPosition= */ true) // Clears the playlist. If prepared, the player transitions to the ended state. player.clearMediaItems()
Java
// Replaces the playlist with a new one. ImmutableList<MediaItem> newItems = ImmutableList.of(MediaItem.fromUri(fourthUri), MediaItem.fromUri(fifthUri)); player.setMediaItems(newItems, /* resetPosition= */ true); // Clears the playlist. If prepared, the player transitions to the ended state. player.clearMediaItems();
Le lecteur gère automatiquement les modifications lors de la lecture méthode:
- Si l'
MediaItem
en cours de lecture est déplacé, la lecture n'est pas interrompue et et son nouveau successeur sera joué une fois l'opération terminée. - Si l'
MediaItem
en cours de lecture est supprimé, le lecteur lance automatiquement lire le premier successeur restant ou passer à l'état "terminé" un autre successeur existe. - Si l'
MediaItem
en cours de lecture est remplacé, la lecture n'est pas interrompue si aucune des propriétés duMediaItem
pertinent pour la lecture modifié. Par exemple, il est possible de mettre à jourMediaItem.MediaMetadata
dans la plupart des cas sans affecter la lecture.
Interroger la playlist
Vous pouvez interroger la playlist à l'aide de Player.getMediaItemCount
et
Player.getMediaItemAt
L'élément multimédia en cours de lecture peut être interrogé
en appelant Player.getCurrentMediaItem
. D'autres options sont également
des méthodes telles que Player.hasNextMediaItem
ou Player.getNextMediaItemIndex
pour
simplifier la navigation dans la playlist.
Modes de répétition
Le lecteur prend en charge trois modes de répétition pouvant être définis à tout moment avec
Player.setRepeatMode
:
Player.REPEAT_MODE_OFF
: la playlist n'est pas répétée et le lecteur passer àPlayer.STATE_ENDED
une fois que le dernier élément de la playlist a déjà été lu.Player.REPEAT_MODE_ONE
: l'élément actuel est répété dans une boucle sans fin. Les méthodes telles quePlayer.seekToNextMediaItem
ignorent cela et recherchent le prochain élément de la liste, qui est ensuite répété dans une boucle sans fin.Player.REPEAT_MODE_ALL
: la playlist est répétée dans une boucle sans fin.
Mode aléatoire
Vous pouvez activer ou désactiver le mode aléatoire à tout moment
Player.setShuffleModeEnabled
En mode aléatoire,
dans un ordre aléatoire précalculé. Tous les éléments seront lus une fois et
le mode aléatoire peut également être associé à Player.REPEAT_MODE_ALL
pour répéter
le même ordre aléatoire
dans une boucle sans fin. Lorsque le mode aléatoire est désactivé,
la lecture reprend à partir de l'élément actuel à sa position d'origine dans
la playlist.
Notez que les index renvoyés par des méthodes telles que
Player.getCurrentMediaItemIndex
fait toujours référence à l'original, non lu en mode aléatoire
commande. De même, Player.seekToNextMediaItem
ne lit pas l'élément à
player.getCurrentMediaItemIndex() + 1
, mais l'élément suivant
ordre de lecture aléatoire. Si vous insérez de nouveaux éléments dans la playlist ou en supprimez,
l'ordre de brassage existant inchangé dans la mesure du possible.
Définir un ordre de lecture aléatoire personnalisé
Par défaut, le lecteur accepte la lecture en mode aléatoire à l'aide de DefaultShuffleOrder
.
Vous pouvez le personnaliser en fournissant une implémentation personnalisée de l'ordre de brassage ou en
définir un ordre personnalisé dans le constructeur DefaultShuffleOrder
:
Kotlin
// Set a custom shuffle order for the 5 items currently in the playlist: exoPlayer.setShuffleOrder(DefaultShuffleOrder(intArrayOf(3, 1, 0, 4, 2), randomSeed)) // Enable shuffle mode. exoPlayer.shuffleModeEnabled = true
Java
// Set a custom shuffle order for the 5 items currently in the playlist: exoPlayer.setShuffleOrder(new DefaultShuffleOrder(new int[] {3, 1, 0, 4, 2}, randomSeed)); // Enable shuffle mode. exoPlayer.setShuffleModeEnabled(/* shuffleModeEnabled= */ true);
Identifier les éléments de la playlist
Pour identifier les éléments de la playlist, vous pouvez définir MediaItem.mediaId
lors de la création de la
élément:
Kotlin
// Build a media item with a media ID. val mediaItem = MediaItem.Builder().setUri(uri).setMediaId(mediaId).build()
Java
// Build a media item with a media ID. MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setMediaId(mediaId).build();
Si une application ne définit pas explicitement d'ID multimédia pour un élément multimédia, la chaîne de l'URI est utilisée.
Associer les données de l'application à des éléments de playlist
En plus d'un ID, chaque élément multimédia peut être configuré avec une balise personnalisée, qui peut être n'importe quel objet fourni par l'application. Les tags personnalisés permettent par exemple à chaque élément multimédia:
Kotlin
// Build a media item with a custom tag. val mediaItem = MediaItem.Builder().setUri(uri).setTag(metadata).build()
Java
// Build a media item with a custom tag. MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setTag(metadata).build();
Détecter quand la lecture passe à un autre élément multimédia
Lorsque la lecture passe à un autre élément multimédia ou commence à répéter le même contenu
élément multimédia, Listener.onMediaItemTransition(MediaItem,
@MediaItemTransitionReason)
est appelé. Ce rappel reçoit le nouveau contenu
avec un élément @MediaItemTransitionReason
indiquant pourquoi la transition
s'est produit. Un cas d'utilisation courant de onMediaItemTransition
consiste à mettre à jour
de l'application pour le nouvel élément multimédia:
Kotlin
override fun onMediaItemTransition( mediaItem: MediaItem?, @MediaItemTransitionReason reason: Int, ) { updateUiForPlayingMediaItem(mediaItem) }
Java
@Override public void onMediaItemTransition( @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) { updateUiForPlayingMediaItem(mediaItem); }
Si les métadonnées requises pour la mise à jour de l'interface utilisateur sont associées à chaque élément multimédia à l'aide de balises personnalisées, l'implémentation peut se présenter comme suit:
Kotlin
override fun onMediaItemTransition( mediaItem: MediaItem?, @MediaItemTransitionReason reason: Int, ) { var metadata: CustomMetadata? = null mediaItem?.localConfiguration?.let { localConfiguration -> metadata = localConfiguration.tag as? CustomMetadata } updateUiForPlayingMediaItem(metadata) }
Java
@Override public void onMediaItemTransition( @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) { @Nullable CustomMetadata metadata = null; if (mediaItem != null && mediaItem.localConfiguration != null) { metadata = (CustomMetadata) mediaItem.localConfiguration.tag; } updateUiForPlayingMediaItem(metadata); }
Détecter les changements dans la playlist
Lorsqu'un élément multimédia est ajouté, supprimé ou déplacé,
Listener.onTimelineChanged(Timeline, @TimelineChangeReason)
est appelé
immédiatement avec TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
. Ce rappel est
appelé même lorsque le joueur n'a pas encore été préparé.
Kotlin
override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) { if (reason == Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) { // Update the UI according to the modified playlist (add, move or remove). updateUiForPlaylist(timeline) } }
Java
@Override public void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) { if (reason == TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) { // Update the UI according to the modified playlist (add, move or remove). updateUiForPlaylist(timeline); } }
Lorsque des informations telles que la durée d'un élément multimédia dans la playlist deviennent
disponible, Timeline
sera mis à jour et onTimelineChanged
sera appelé
avec TIMELINE_CHANGE_REASON_SOURCE_UPDATE
. Les autres raisons pouvant expliquer
du calendrier concerné incluent les éléments suivants:
- Fichier manifeste disponible après avoir préparé un élément multimédia adaptatif.
- Fichier manifeste mis à jour régulièrement pendant la lecture d'une diffusion en direct.