La API de playlist se define con la interfaz Player, que se implementa en todas las implementaciones de ExoPlayer. Las playlists permiten la reproducción secuencial de varios elementos multimedia. En el siguiente ejemplo, se muestra cómo iniciar la reproducción de una playlist que contiene dos videos:
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();
Las transiciones entre los elementos de una playlist son fluidas. No es necesario que tengan el mismo formato (por ejemplo, está bien que una playlist contenga videos en H264 y VP9). Incluso pueden ser de diferentes tipos (es decir, está bien que una playlist contenga videos, imágenes y transmisiones solo de audio). Puedes usar el mismo MediaItem varias veces en una playlist.
Cómo modificar la playlist
Puedes modificar una playlist de forma dinámica agregando, moviendo, quitando o reemplazando elementos multimedia. Esto se puede hacer antes y durante la reproducción llamando a los métodos de la API de playlist correspondientes:
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));
También se admite el reemplazo y el borrado de toda 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();
El reproductor controla automáticamente las modificaciones durante la reproducción de la manera correcta:
- Si se mueve el
MediaItemque se está reproduciendo, la reproducción no se interrumpe y se reproducirá su nuevo sucesor cuando finalice. - Si se quita el
MediaItemque se está reproduciendo, el reproductor reproducirá automáticamente el primer sucesor restante o pasará al estado finalizado si no existe tal sucesor. - Si se reemplaza el
MediaItemque se está reproduciendo, la reproducción no se interrumpe si no cambia ninguna de las propiedades delMediaItemrelevantes para la reproducción. Por ejemplo, en la mayoría de los casos, es posible actualizar los campos deMediaItem.MediaMetadatasin afectar la reproducción.
Cómo consultar la playlist
Se puede consultar la playlist con Player.getMediaItemCount y Player.getMediaItemAt. El elemento multimedia que se está reproduciendo actualmente se puede consultar llamando a Player.getCurrentMediaItem. También hay otros métodos convenientes, como Player.hasNextMediaItem o Player.getNextMediaItemIndex, para simplificar la navegación en la playlist.
Modos de repetición
El reproductor admite 3 modos de repetición que se pueden configurar en cualquier momento con Player.setRepeatMode:
Player.REPEAT_MODE_OFF: La playlist no se repite y el reproductor hará la transición aPlayer.STATE_ENDEDuna vez que se reproduzca el último elemento de la playlist.Player.REPEAT_MODE_ONE: El elemento actual se repite en un bucle infinito. Los métodos comoPlayer.seekToNextMediaItemignorarán esto y buscarán el siguiente elemento de la lista, que luego se repetirá en un bucle sin fin.Player.REPEAT_MODE_ALL: Se repite toda la playlist en un bucle infinito.
Modo aleatorio
El modo aleatorio se puede habilitar o inhabilitar en cualquier momento con Player.setShuffleModeEnabled. Cuando esté en modo aleatorio, el reproductor reproducirá la playlist en un orden aleatorio precalculado. Todos los elementos se reproducirán una vez, y el modo aleatorio también se puede combinar con Player.REPEAT_MODE_ALL para repetir el mismo orden aleatorio en un bucle sin fin. Cuando el modo aleatorio está desactivado, la reproducción continúa desde el elemento actual en su posición original en la playlist.
Ten en cuenta que los índices que devuelven métodos como Player.getCurrentMediaItemIndex siempre hacen referencia al orden original sin mezclar. Del mismo modo, Player.seekToNextMediaItem no reproducirá el elemento en player.getCurrentMediaItemIndex() + 1, sino el siguiente elemento según el orden aleatorio. Si insertas elementos nuevos en la playlist o quitas elementos, el orden aleatorio existente se mantendrá sin cambios en la medida de lo posible.
Cómo establecer un orden aleatorio personalizado
De forma predeterminada, el reproductor admite la reproducción aleatoria con DefaultShuffleOrder.
Esto se puede personalizar proporcionando una implementación de orden aleatorio personalizada o estableciendo un orden personalizado en el constructor 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);
Cómo identificar elementos de playlists
Para identificar elementos de la playlist, se puede configurar MediaItem.mediaId cuando se crea el elemento:
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 una app no define de forma explícita un ID de medio para un elemento multimedia, se usa la representación de cadena del URI.
Cómo asociar datos de la app con elementos de la playlist
Además de un ID, cada elemento multimedia también se puede configurar con una etiqueta personalizada, que puede ser cualquier objeto proporcionado por la app. Uno de los usos de las etiquetas personalizadas es adjuntar metadatos a cada elemento multimedia:
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();
Cómo detectar cuándo la reproducción pasa a otro elemento multimedia
Cuando la reproducción pasa a otro elemento multimedia o comienza a repetir el mismo elemento multimedia, se llama a Listener.onMediaItemTransition(MediaItem,
@MediaItemTransitionReason). Esta devolución de llamada recibe el nuevo elemento multimedia, junto con un objeto @MediaItemTransitionReason que indica el motivo de la transición. Un caso de uso común para onMediaItemTransition es actualizar la IU de la app para el nuevo elemento multimedia:
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 los metadatos necesarios para actualizar la IU se adjuntan a cada elemento multimedia con etiquetas personalizadas, una implementación podría verse de la siguiente manera:
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); }
Cómo detectar cuándo cambia la playlist
Cuando se agrega, quita o mueve un elemento multimedia, se llama a Listener.onTimelineChanged(Timeline, @TimelineChangeReason) de inmediato con TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED. Esta devolución de llamada se invoca incluso cuando el reproductor aún no se preparó.
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); } }
Cuando se encuentre disponible información como la duración de un elemento multimedia en la playlist, se actualizará Timeline y se llamará a onTimelineChanged con TIMELINE_CHANGE_REASON_SOURCE_UPDATE. Otros motivos que pueden causar una actualización de la línea de tiempo incluyen los siguientes:
- Un manifiesto que se encuentra disponible después de preparar un elemento multimedia adaptable.
- Es un manifiesto que se actualiza periódicamente durante la reproducción de una transmisión en vivo.