Playlists

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 bewegt 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 in MediaItem für die Wiedergabe relevant ist. geändert. Beispielsweise ist es möglich, den MediaItem.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 zu Player.STATE_ENDED wechseln, sobald das letzte Element der Playlist gespielt wurden.
  • Player.REPEAT_MODE_ONE: Das aktuelle Element wird in einer Endlosschleife wiederholt. Methoden wie Player.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 Zufallsmix 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älligen 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 spielt Player.seekToNextMediaItem das Element nicht unter 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 in einer App nicht explizit eine Medien-ID für ein Medienelement definiert wird, 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-Wert, der angibt, warum der Übergang 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.