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 abstrakten Klasse BasePreloadManager basieren, können Sie Inhalte nach den von Ihnen ausgewählten Kriterien einstufen. In diesem Dokument wird beschrieben, wie Sie die abgeleitete Klasse DefaultPreloadManager verwenden. In dieser Klasse wird jedes Medienelement mit einer Ganzzahl eingestuft, die seine Position in einer Liste darstellt, z. B. seine Position in einem Videokarussell. Der Preload-Manager priorisiert das Laden der Elemente danach, wie nah sie an dem Element sind, das der Nutzer gerade wiedergibt. Wenn ein Nutzer zu einem anderen Element wechselt, kann die Wiedergabe des neuen Elements sofort beginnen.

So erstellen Sie eine Instanz von DefaultPreloadManager:

  • Definieren Sie eine TargetPreloadStatusControl, die der Preload-Manager abfragen kann, um herauszufinden, ob das Media-Element 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.
  • Erstellen Sie den Preload-Manager mit dem Builder, indem Sie die Methode build() des Builders aufrufen.

Kontrollgruppe für den Zielvorab-Ladezustand erstellen

Wenn Sie das DefaultPreloadManager.Builder erstellen, übergeben Sie ihm ein von Ihnen definiertes target preload status control-Objekt. Dieses Objekt implementiert die TargetPreloadStatusControl-Schnittstelle. Wenn der Preload-Manager Medien vorab laden möchte, ruft er die Methode getTargetPreloadStatus() der Statussteuerung auf, um zu ermitteln, ob Inhalte für ein Media-Element vorbereitet, geladen oder im Cache gespeichert werden sollen. Beim Vorabladen werden Mediendaten direkt in den In-Memory-Puffer eines Players geladen, sodass sie sofort wiedergegeben werden können. Beim Caching werden die Mediendaten in einem persistenten Datenträger-Cache gespeichert, um den Playerspeicher zu schonen. 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) in den In-Memory-Puffer des Players laden.
  • STAGE_SPECIFIED_RANGE_CACHED: Der Preload-Manager soll die Inhalte ab der angegebenen Startposition und für die angegebene Dauer (in Millisekunden) im Datenträger-Cache speichern.
  • STAGE_TRACKS_SELECTED: Der Preload-Manager sollte die Informationen des Content-Tracks laden und verarbeiten und die Tracks auswählen. Der Preload-Manager sollte noch nicht mit dem Laden der Inhalte beginnen.
  • STAGE_SOURCE_PREPARED: Der Preload-Manager soll die Inhaltsquelle vorbereiten. Wenn sich die Metadaten des Inhalts beispielsweise in einer separaten Manifestdatei befinden, ruft der Preload-Manager dieses Manifest ab und parst es.
  • null: Der Preload-Manager sollte keine Inhalte oder Metadaten für dieses Media-Element laden.

Sie benötigen eine Strategie, um zu entscheiden, wie viele Inhalte für jedes Media-Element geladen werden sollen. In diesem Beispiel werden für Elemente, die sich am nächsten am aktuell wiedergegebenen Element befinden, mehr Inhalte geladen. Wenn der Nutzer Inhalte mit dem Index n wiedergibt, gibt der Controller die folgenden Codes zurück:

  • Index n+1 (die nächste Mediendatei): 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: Rückgabe PreloadStatus.TRACKS_SELECTED
  • Andere Medienelemente im Bereich n–4 bis n+4: Rückgabe PreloadStatus.SOURCE_PREPARED
  • Geben Sie für alle anderen Media-Elemente null zurück.

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 wiedergegebenen 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 das entsprechende Media-Element 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 den zurückzugebenden Code aus, indem sie diesen Index mit dem Index des aktuell ausgewählten Elements vergleicht.

Vorablade-Manager erstellen

Zum Erstellen Ihres Preload-Managers benötigen Sie ein DefaultPreloadManager.Builder. Dieser Builder wird mit dem aktuellen Kontext und der Steuerung des Zielvorabladestatus der App konfiguriert. Sie können einen Preload-Manager mit allen Standardkonfigurationen erstellen.

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

Der Builder bietet auch Setter-Methoden, mit denen Sie die benutzerdefinierten Komponenten des Preload-Managers festlegen können.

Sie können beispielsweise die Zielpuffergröße für alle Quellen für das Vorabladen von Media in DefaultPreloadManager anpassen, damit die vorab geladenen Daten dieses Limit nicht überschreiten. Sie können dieses Limit mit setPlayerTargetBufferBytes(String, int) für eine benutzerdefinierte DefaultLoadControl.Builder mit dem Playernamen "preload" konfigurieren und diese Instanz an den Preload-Manager-Builder übergeben:

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

preloadManagerBuilder.setLoadControl(
  DefaultLoadControl.Builder()
    .setPlayerTargetBufferBytes("preload", 128 * 1024 * 1024) // 128 MiB
    .build()
)
val preloadManager = preloadManagerBuilder.build()

Die Setter-Methoden des Builders sind für die Anpassung im Grunde optional. Wenn Sie jedoch Media-Elemente auf der Festplatte zwischenspeichern möchten, müssen Sie den Builder mit einem Cache konfigurieren, indem Sie setCache() aufrufen. Wenn kein Cache konfiguriert ist, führt der Versuch, die Media-Elemente zu cachen, zu einem IllegalStateException.

ExoPlayer zum Abspielen der vorab geladenen Mediendatei erstellen

Sie verwenden den Builder nicht nur zum Erstellen des Preload-Managers, sondern auch zum Erstellen der ExoPlayer-Objekte, die Ihre App zum Abspielen der Inhalte verwendet, damit der ExoPlayer Komponenten korrekt mit dem Preload-Manager teilt. Sie können die wiedergabespezifischen Konfigurationen für ExoPlayer weiterhin festlegen, indem Sie eine ExoPlayer.Builder-Instanz mit diesen Konfigurationen übergeben.

// Direct creation
val exoPlayer = preloadManagerBuilder.buildExoPlayer()

// Creation with custom playback specific configurations
val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true)
val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)