DefaultPreloadManager erstellen und konfigurieren

Auf dieser Seite wird beschrieben, wie Sie einen DefaultPreloadManager erstellen, der Medieninhalte für Ihre App basierend auf der von Ihnen ausgewählten Strategie vorab lädt.

Mit Preload-Managern, die auf der BasePreloadManager abstrakten Klasse basieren, können Sie Inhalte nach den von Ihnen ausgewählten Kriterien einstufen. In diesem Dokument wird erläutert, wie Sie die abgeleitete Klasse DefaultPreloadManager verwenden, in der jedes Medienelement mit einer Ganzzahl eingestuft wird, die seine Position in einer Liste darstellt (z. B. seine Position in einem Video-Karussell). Der Preload-Manager priorisiert das Laden der Elemente danach, wie nah sie an dem Element sind, das der Nutzer gerade abspielt. Wenn ein Nutzer zu einem anderen Element wechselt, kann das neue Element sofort abgespielt werden.

Es gibt drei Schritte zum Erstellen einer Instanz von DefaultPreloadManager:

  • Definieren Sie ein TargetPreloadStatusControl, das der Preload-Manager abfragen kann, um herauszufinden, ob das Medienelement geladen werden kann und wie viel geladen werden soll.
  • Erstellen Sie den Builder, mit dem Sie den Preload-Manager und die ExoPlayer Objekte Ihrer App erstellen.
  • Verwenden Sie den Builder, um den Preload-Manager zu erstellen, indem Sie die Methode build() des Builders aufrufen.

Ziel-Preload-Statussteuerung erstellen

Wenn Sie den DefaultPreloadManager.Builder erstellen, übergeben Sie ihm ein Ziel-Preload-Statussteuerungsobjekt, das Sie definieren. Dieses Objekt implementiert die TargetPreloadStatusControl Schnittstelle. Wenn der Preload-Manager Medien vorab lädt, ruft er die Methode getTargetPreloadStatus() Ihrer Statussteuerung auf, um zu erfahren, wie viel Inhalt geladen werden soll. Die Statussteuerung kann mit einem der folgenden Statuscodes antworten:

  • STAGE_SPECIFIED_RANGE_LOADED: Der Preload-Manager sollte den Inhalt ab der angegebenen Startposition und für die angegebene Dauer (in Millisekunden) laden.
  • STAGE_TRACKS_SELECTED: Der Preload-Manager sollte die Informationen des Inhaltstracks laden und verarbeiten und die Tracks auswählen. Der Preload-Manager sollte noch nicht mit dem Laden des Inhalts beginnen.
  • STAGE_SOURCE_PREPARED: Der Preload-Manager sollte die Inhaltsquelle vorbereiten. Wenn sich die Metadaten des Inhalts beispielsweise in einer separaten Manifestdatei befinden, kann der Preload-Manager dieses Manifest abrufen und parsen.
  • null: Der Preload-Manager sollte keine Inhalte oder Metadaten für dieses Medienelement laden.

Sie benötigen eine Strategie, um zu entscheiden, wie viel Inhalt für jedes Medienelement geladen werden soll. In diesem Beispiel werden für Elemente, die dem aktuell abgespielten Element am nächsten sind, mehr Inhalte geladen. Wenn der Nutzer Inhalte mit dem Index n, gibt der Controller die folgenden Codes zurück:

  • Index n+1 (das nächste Medienelement): 3.000 ms (3 Sekunden) ab der Standardstartposition laden
  • Index n-1 (das vorherige Medienelement): 1.000 ms (1 Sekunde) ab der Standardstartposition laden
  • Andere Medienelemente im Bereich n-2 bis n+2: Zurückgeben PreloadStatus.TRACKS_SELECTED
  • Andere Medienelemente im Bereich n-4 bis n+4: Zurückgeben PreloadStatus.SOURCE_PREPARED
  • Für alle anderen Medienelemente null zurückgeben

class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) :
  TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {

  override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus {
    if (index - currentPlayingIndex == 1) { // next track
      // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
      // suggest loading 3000ms from the default start position
      return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
    } else if (index - currentPlayingIndex == -1) { // previous track
      // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
      // suggest loading 3000ms from the default start position
      return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
    } else if (abs(index - currentPlayingIndex) == 2) {
      // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
      return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED
    }
    return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED
  }
}

Wichtige Punkte zum Code

  • Sie übergeben eine Instanz von MyTargetPreloadStatusControl an den Preload-Manager-Builder, wenn Sie ihn erstellen.
  • currentPlayingIndex enthält den Index des aktuell abgespielten Medienelements. Es ist Aufgabe der App, diesen Wert auf dem neuesten Stand zu halten.
  • Wenn der Preload-Manager bereit ist, Inhalte zu laden, ruft er getTargetPreloadStatus auf und übergibt die Ranking-Informationen, die Sie für dieses entsprechende Medienelement angegeben haben. Im Fall von DefaultPreloadManager ist diese Ranking-Information eine Ganzzahl, die die Position des Elements in einem Karussell angibt. Die Methode wählt aus, welcher Code zurückgegeben werden soll, indem sie diesen Index mit dem Index des aktuell ausgewählten Elements vergleicht.

Preload-Manager erstellen

Zum Erstellen des Preload-Managers benötigen Sie einen DefaultPreloadManager.Builder. Dieser Builder wird mit dem aktuellen Kontext und der Ziel-Preload-Statussteuerung der App konfiguriert. Der Builder bietet auch Setter-Methoden, mit denen Sie die benutzerdefinierten Komponenten des Preload-Managers festlegen können.

Sie verwenden den Builder nicht nur zum Erstellen des Preload-Managers, sondern auch zum Erstellen der ExoPlayer-Objekte, mit denen Ihre App die Inhalte abspielt.

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

Wichtige Punkte zum Code

  • MyTargetPreloadStatusControl ist die Klasse, die Sie unter Ziel Preload-Statussteuerung erstellen definiert haben.
  • Sie verwenden denselben DefaultPreloadManager.Builder, um die ExoPlayer-Objekte zu erstellen, mit denen Inhalte abgespielt werden, die von diesem Preload-Manager verwaltet werden.