Die Playlist API wird durch die Player
-Schnittstelle definiert, die durch
alle ExoPlayer
-Implementierungen Playlists ermöglichen die sequenzielle Wiedergabe mehrerer
Medienelemente. Das folgende Beispiel zeigt, wie du die Wiedergabe einer Playlist startest.
mit zwei 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();
Übergänge zwischen Elementen in einer Playlist sind nahtlos. Es gibt keine Anforderung
dass beide dasselbe Format haben.
Eine Playlist kann beispielsweise beide
H264- und VP9-Videos). Sie können sogar unterschiedlicher Art sein, d. h., es ist für einen
Playlist so, dass sie Videos, Bilder und reine Audiostreams enthält.) Sie können die
dasselbe MediaItem
-Objekt innerhalb einer Playlist mehrmals hintereinander
Playlist ändern
Du kannst eine Playlist dynamisch ändern, indem du Elemente hinzufügst, verschiebst, entfernst oder ersetzt. Medienelemente. Dies kann sowohl vor als auch während der Wiedergabe erfolgen, indem die entsprechenden Playlist-API-Methoden:
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));
Das Ersetzen und Löschen der gesamten Playlist wird ebenfalls unterstützt:
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();
Im Player werden Änderungen während der Wiedergabe automatisch Weg:
- Wenn
MediaItem
verschoben wird, wird die Wiedergabe nicht unterbrochen und der neue Nachfolger wird nach Abschluss abgespielt. - Wenn
MediaItem
entfernt wird, wird der Player automatisch den ersten verbleibenden Nachfolger wiedergeben oder in den Status „Beendet“ übergehen, falls kein ob ein solcher Nachfolger existiert. - Wenn die aktuell wiedergegebene
MediaItem
ersetzt wird, wird die Wiedergabe nicht unterbrochen. wenn keine der Eigenschaften inMediaItem
für die Wiedergabe relevant ist. geändert. Beispielsweise ist es möglich, denMediaItem.MediaMetadata
ohne Auswirkungen auf die Wiedergabe zu haben.
Playlist abfragen
Die Playlist kann mit Player.getMediaItemCount
abgefragt werden und
Player.getMediaItemAt
. Das aktuell wiedergegebene Medienelement kann abgefragt werden
indem du Player.getCurrentMediaItem
anrufst. Es gibt auch andere praktische Funktionen.
wie Player.hasNextMediaItem
oder Player.getNextMediaItemIndex
, um
um die Navigation in der Playlist zu vereinfachen.
Wiederholungsmodi
Der Player unterstützt 3 Wiederholungsmodi, die jederzeit mit
Player.setRepeatMode
:
Player.REPEAT_MODE_OFF
: Die Playlist wird nicht wiederholt und der Player wird zuPlayer.STATE_ENDED
wechseln, sobald das letzte Element der Playlist gespielt wurden.Player.REPEAT_MODE_ONE
: Das aktuelle Element wird in einer Endlosschleife wiederholt. Methoden wiePlayer.seekToNextMediaItem
ignorieren dies und suchen nach der sich dann in einer Endlosschleife wiederholt.Player.REPEAT_MODE_ALL
: Die gesamte Playlist wird in einer Endlosschleife wiederholt.
Zufallsmix
Der Shuffle-Modus kann jederzeit mit
Player.setShuffleModeEnabled
Im Zufallsmix spielt der Player
Playlist in einer vorausberechneten, zufälligen Reihenfolge. Alle Elemente werden einmal abgespielt und
Der Zufallsmix kann auch mit Player.REPEAT_MODE_ALL
kombiniert werden,
in der gleichen zufällig ausgewählten Reihenfolge
in einer Endlosschleife. Wenn der Zufallsmix deaktiviert ist,
wird die Wiedergabe ab dem aktuellen Element an der ursprünglichen Position im
.
Beachten Sie, dass die Indizes, die von Methoden wie
Player.getCurrentMediaItemIndex
beziehen sich immer auf das Original (nicht zufällig ausgewählt)
Reihenfolge. Ebenso gibt Player.seekToNextMediaItem
das Element nicht hier ab:
player.getCurrentMediaItemIndex() + 1
, aber das nächste Element laut
Zufallsmix wiedergeben. Wenn du neue Elemente in die Playlist einfügst oder Elemente entfernst, werden diese beibehalten
die vorhandene Shuffle-Reihenfolge so weit wie möglich unverändert lassen.
Benutzerdefinierte Zufallsmix-Reihenfolge festlegen
Standardmäßig unterstützt der Player den Zufallsmix mithilfe von DefaultShuffleOrder
.
Dies kann angepasst werden, indem Sie eine benutzerdefinierte Implementierung der Shuffle-Reihenfolge bereitstellen oder
Sie legen eine benutzerdefinierte Reihenfolge im DefaultShuffleOrder
-Konstruktor fest:
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);
Playlist-Elemente identifizieren
Um Playlist-Elemente zu identifizieren, kann MediaItem.mediaId
beim Erstellen des
Artikel:
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();
Wenn eine App für ein Medienelement nicht explizit eine Medien-ID definiert, wird der String des URI verwendet wird.
App-Daten mit Playlist-Elementen verknüpfen
Zusätzlich zu einer ID kann jedes Medienelement auch mit einem benutzerdefinierten Tag konfiguriert werden, Dies kann ein beliebiges von der App bereitgestelltes Objekt sein. Benutzerdefinierte Tags können beispielsweise Metadaten zu jedem Medienelement:
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();
Erkennen, wenn die Wiedergabe zu einem anderen Medienelement übergeht
Wenn bei der Wiedergabe zu einem anderen Medienelement gewechselt wird oder das gleiche Element wiederholt wird
Medienelement wird Listener.onMediaItemTransition(MediaItem,
@MediaItemTransitionReason)
aufgerufen. Dieser Callback empfängt die neuen Medien
hinzugefügt, zusammen mit einem @MediaItemTransitionReason
, das den Grund für den Übergang angibt
aufgetreten. Ein häufiger Anwendungsfall für onMediaItemTransition
ist die Aktualisierung des
App-Benutzeroberfläche für das neue Medienelement:
Kotlin
override fun onMediaItemTransition( mediaItem: MediaItem?, @MediaItemTransitionReason reason: Int, ) { updateUiForPlayingMediaItem(mediaItem) }
Java
@Override public void onMediaItemTransition( @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) { updateUiForPlayingMediaItem(mediaItem); }
Wenn die zum Aktualisieren der Benutzeroberfläche erforderlichen Metadaten mithilfe von benutzerdefinierten Tags erstellen, kann eine Implementierung wie folgt aussehen:
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); }
Änderungen der Playlist erkennen
Wenn ein Medienelement hinzugefügt, entfernt oder verschoben wird,
Listener.onTimelineChanged(Timeline, @TimelineChangeReason)
wird aufgerufen
sofort mit TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
. Dieser Callback ist
auch wenn der Spieler
noch nicht vorbereitet ist.
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); } }
Wenn Informationen wie die Dauer eines Medienelements in der Playlist
verfügbar ist, wird die Timeline
aktualisiert und onTimelineChanged
wird aufgerufen
mit TIMELINE_CHANGE_REASON_SOURCE_UPDATE
. Andere Gründe, die einen
Das Zeitplan-Update umfasst Folgendes:
- Ein Manifest, das nach der Vorbereitung eines adaptiven Medienelements verfügbar wird.
- Ein Manifest, das regelmäßig während der Wiedergabe eines Livestreams aktualisiert wird.