Inhalte verwalten und abspielen

Auf dieser Seite wird beschrieben, wie Sie Videoinhalte mit einem Preload-Manager verwalten. Mit einem Preload-Manager kannst du die Nutzerfreundlichkeit verbessern. Wenn der Nutzer von einer Mediendatei zu einer anderen wechselt, beginnt die Wiedergabe schneller, da der Manager bereits einen Teil des Inhalts geladen hat.

Auf dieser Seite werden die folgenden Themen behandelt:

Mediendateien zum Preload-Manager hinzufügen

Du musst den Preload-Manager über jede Mediendatei informieren, die er im Auge behalten soll. Wenn Ihre App beispielsweise ein Karussell mit Videos hat, fügen Sie diese dem Preload-Manager hinzu. Je nach Anwendungsfall können Sie alle Videos oder nur die Videos in der Nähe des aktuell wiedergegebenen Videos hinzufügen. Sie können dem Preload Manager auch später neue Elemente hinzufügen.

Verwenden Sie dazu eine Methode zum Hinzufügen im Batch, z. B. addMediaItems. Alternativ können Sie add (oder addMediaSource) aufrufen, um Mediendateien einzeln hinzuzufügen. Wenn Sie Mediendateien einzeln hinzufügen, wird das Vorabladen jedoch nicht automatisch ausgelöst. Wenn Sie einzelne Methoden verwenden, müssen Sie explizit invalidate aufrufen, nachdem Sie Elemente hinzugefügt haben, um den Preload Manager anzuweisen, die Prioritäten zu aktualisieren und mit dem Vorabladen zu beginnen.

val initialMediaItems = pullMediaItemsFromService(count = 20)
val rankingDataList = initialMediaItems.indices.toList()
preloadManager.addMediaItems(initialMediaItems, rankingDataList)

Wichtige Punkte zum Code

  • In diesem Snippet wird gezeigt, wie Sie den Preload-Manager nach dem Erstellen im Batchmodus füllen. Sie können addMediaItems aufrufen, um Elemente zu einem vorhandenen, ausgefüllten Preload-Manager hinzuzufügen.
  • In diesem Snippet ist pullMediaItemsFromService() die Logik der App, um die Liste der abzuspielenden Inhalte abzurufen. Der Code ruft diese Methode auf, um eine Liste mit bis zu 20 Elementen abzurufen.
  • preloadManager ist die DefaultPreloadManager, die unter DefaultPreloadManager erstellen erstellt wurde.
  • rankingData ist ein Wert, den der Preload-Manager verwendet, um die Priorität der einzelnen Mediendateien zu bestimmen. Bei DefaultPreloadManager ist rankingData eine Ganzzahl, die die Position des Elements im Karussell darstellt. Der Preload-Manager bestimmt die Priorität anhand der Entfernung der einzelnen Elemente von dem Element, das gerade wiedergegeben wird.

Medien abrufen und abspielen

Wenn der Nutzer zu einer neuen Mediendatei wechselt, musst du die Mediendatei vom Preload-Manager abrufen. Wenn der Preload Manager einen Teil des Inhalts geladen hat, wird der Inhalt schneller wiedergegeben, als wenn Sie den Preload Manager nicht verwendet hätten. Wenn der Preload-Manager noch keine Inhalte aus diesem Element geladen hat, werden die Inhalte normal abgespielt.

Außerdem müssen Sie den aktuellen Wiedergabeindex im Preload-Manager aktualisieren, indem Sie setCurrentPlayingIndex aufrufen. So kann der Preload-Manager die Prioritäten zukünftiger Vorladevorgänge bestimmen.

// When a media item is about to be displayed on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If the mediaSource is null, its mediaItem hasn't been added to the preload
  // manager yet. Send it directly to the player when it's about to play.
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is being displayed at the center of the screen ("in focus")
player.play()
// Update the current playing index to let the preload manager know where the user
// is in the carousel/pagination/list.
preloadManager.setCurrentPlayingIndex(currentIndex)

Wichtige Punkte zum Code

  • player ist die Media3-ExoPlayer, die die App zum Abspielen der Inhalte verwendet. Diesen Player musst du erstellen, indem du DefaultPreloadManager.Builder.buildExoPlayer() für denselben Builder aufrufst, mit dem du den Preload-Manager erstellt hast.
  • Wenn der Nutzer zu einer neuen Mediendatei wechselt, ruft die App getMediaSource() auf, um die Medienquelle vom Preload Manager abzurufen. Es muss sich um einen mediaItem handeln, den Sie bereits zum Preload Manager hinzugefügt haben. Es ist in Ordnung, wenn der Preload-Manager noch nicht mit dem Laden des Inhalts begonnen hat. In diesem Fall wird ein MediaSource ohne vorab geladene Daten zurückgegeben. Das kann beispielsweise passieren, wenn der Nutzer im Karussell plötzlich weit nach vorn springt.
  • Nachdem der Nutzer das neue Medienelement abgespielt hat, rufe setCurrentPlayingIndex auf, um dem Preload-Manager mitzuteilen, wo sich das neue Element im Karussell befindet. Der Preload-Manager benötigt diese Informationen, um das Laden des nächsten Elements zu priorisieren.

Elemente aus dem Preload-Manager entfernen

Damit der Preload-Manager effizient bleibt, sollten Sie Elemente entfernen, die der Preload-Manager nicht mehr verfolgen muss. Sie können auch Elemente entfernen, die sich noch im Karussell befinden, aber weit von der aktuellen Position des Nutzers entfernt sind. Beispielsweise können Sie festlegen, dass ein Element, das mehr als 15 Elemente von dem entfernt ist, was sich der Nutzer gerade ansieht, nicht vorab geladen werden muss. In diesem Fall würden Sie Elemente entfernen, wenn sie so weit entfernt sind. Wenn der Nutzer sich wieder in Richtung dieser entfernten Elemente bewegt, können Sie sie jederzeit wieder hinzufügen.

Wenn Sie eine Liste mit zu entfernenden Mediendateien haben, können Sie removeMediaItems verwenden. Alternativ können Sie remove (oder removeMediaSource) aufrufen, um Mediendateien einzeln zu entfernen.

preloadManager.removeMediaItems(mediaItemsToRemove)

Wichtige Punkte zum Code

  • Wenn Sie alle Elemente aus dem Preload-Manager entfernen möchten, können Sie reset() anstelle von remove() aufrufen. Dieser Ansatz ist nützlich, wenn Sie alle Elemente in Ihrem Karussell ändern müssen. In diesem Fall müssen Sie nach dem Entfernen der Elemente neue Elemente zum PreloadManager hinzufügen.

PreloadManager freigeben, wenn Sie ihn nicht mehr benötigen

Wenn du den PreloadManager nicht mehr benötigst, musst du ihn freigeben, um seine Ressourcen freizugeben. Achten Sie insbesondere darauf, die Freigabe aufzuheben, wenn Ihre Aktivität gelöscht wird.

preloadManager.release()

Wichtige Punkte zum Code

  • Sie dürfen keine Methoden des Objekts aufrufen, nachdem Sie es freigegeben haben.
  • Wenn Sie einen weiteren Preload-Manager erstellen müssen, erstellen Sie einen neuen DefaultPreloadManager.Builder und verwenden Sie ihn, um den DefaultPreloadManager zu erstellen. Versuchen Sie nicht, den alten Builder wiederzuverwenden.