Tworzenie i konfigurowanie klasy DefaultPreloadManager

Na tej stronie dowiesz się, jak utworzyć DefaultPreloadManager, który wstępnie wczytuje treści multimedialne w aplikacji na podstawie wybranej strategii.

Menedżerowie wstępnego wczytywania oparty na klasie abstrakcyjnej BasePreloadManager umożliwiają Ci określanie rankingu treści na podstawie wybranych kryteriów. Z tego dokumentu dowiesz się, jak używać klasy pochodnej DefaultPreloadManager, w której każdy element multimedialny jest klasyfikowany za pomocą liczby całkowitej reprezentującej jego położenie na liście (np. pozycję w karuzeli wideo). Menedżer wstępnego wczytywania nadaje priorytet wczytywaniu elementów na podstawie tego, jak blisko są one elementu, który użytkownik aktualnie odtwarza. Dzięki temu, jeśli użytkownik przejdzie do innego elementu, nowy element może zacząć odtwarzanie od razu.

Utworzenie instancji DefaultPreloadManager składa się z 3 etapów:

  • Zdefiniuj TargetPreloadStatusControl, do którego menedżer wstępnego wczytywania może wysyłać zapytania, aby sprawdzić, czy element multimedialny jest gotowy do wczytania i ile danych należy wczytać.
  • Utwórz narzędzie do tworzenia, którego będziesz używać do tworzenia menedżera wstępnego wczytywania i obiektów ExoPlayer aplikacji.
  • Aby utworzyć menedżera wstępnego wczytywania, użyj narzędzia do tworzenia, wywołując metodę build().

Tworzenie elementu sterującego stanem wstępnego wczytywania

Podczas tworzenia DefaultPreloadManager.Builder przekazujesz do niego zdefiniowany przez siebie obiekt target preload status control. Ten obiekt implementuje interfejs TargetPreloadStatusControl. Gdy menedżer wstępnego wczytywania przygotowuje się do wstępnego wczytania multimediów, wywołuje metodę getTargetPreloadStatus() kontroli stanu, aby określić, czy przygotować, wczytać czy zapisać w pamięci podręcznej treści elementu multimedialnego. Wstępne wczytywanie powoduje bezpośrednie wczytywanie danych multimedialnych do bufora w pamięci odtwarzacza, dzięki czemu są one gotowe do natychmiastowego odtwarzania, a buforowanie zapisuje dane multimedialne w pamięci podręcznej na dysku trwałym, aby oszczędzać pamięć odtwarzacza. Kontrolka stanu może odpowiedzieć jednym z tych kodów stanu:

  • STAGE_SPECIFIED_RANGE_LOADED: menedżer wstępnego wczytywania powinien wczytać do bufora w pamięci odtwarzacza treść od określonej pozycji początkowej przez określony czas (podany w milisekundach).
  • STAGE_SPECIFIED_RANGE_CACHED: menedżer wstępnego wczytywania powinien zapisać w pamięci podręcznej dysku treści od określonej pozycji początkowej przez określony czas (podany w milisekundach).
  • STAGE_TRACKS_SELECTED: menedżer wstępnego wczytywania powinien wczytać i przetworzyć informacje o ścieżce treści oraz wybrać ścieżki. Menedżer wstępnego wczytywania nie powinien jeszcze rozpoczynać wczytywania treści.
  • STAGE_SOURCE_PREPARED: Menedżer wstępnego wczytywania powinien przygotować źródło treści. Jeśli na przykład metadane treści znajdują się w osobnym pliku manifestu, menedżer wstępnego wczytywania może pobrać i przeanalizować ten manifest.
  • null: Menedżer wstępnego wczytywania nie powinien wczytywać żadnych treści ani metadanych tego elementu multimedialnego.

Musisz mieć strategię decydowania o tym, ile treści ma być wczytywanych w przypadku każdego elementu multimedialnego. W tym przykładzie więcej treści jest wczytywanych w przypadku elementów znajdujących się najbliżej aktualnie odtwarzanego elementu. Jeśli użytkownik odtwarza treści z indeksem n, kontroler zwraca te kody:

  • Indeks n+1 (następny element multimedialny): wczytaj 3000 ms (3 sekundy) od domyślnej pozycji początkowej.
  • Indeks n-1 (poprzedni element multimedialny): wczytaj 1000 ms (1 sekundę) od domyślnej pozycji początkowej.
  • Inne elementy multimedialne w zakresie od n-2 do n+2: Return PreloadStatus.TRACKS_SELECTED
  • Inne elementy multimedialne w zakresie od n-4 do n+4: zwracanie PreloadStatus.SOURCE_PREPARED
  • W przypadku wszystkich innych elementów multimedialnych zwróć wartość null.

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
  }
}

Najważniejsze informacje o kodzie

  • Podczas tworzenia narzędzia do tworzenia menedżera wstępnego wczytywania przekażesz instancję MyTargetPreloadStatusControl.
  • currentPlayingIndex zawiera indeks aktualnie odtwarzanego elementu multimedialnego. Obowiązkiem aplikacji jest aktualizowanie tej wartości.
  • Gdy menedżer wstępnego wczytywania jest gotowy do wczytania treści, wywołuje funkcję getTargetPreloadStatus i przekazuje informacje o rankingu określone przez Ciebie dla odpowiedniego elementu multimedialnego. W przypadku DefaultPreloadManager te informacje o rankingu są liczbą całkowitą określającą pozycję produktu w karuzeli. Metoda wybiera kod do zwrócenia, porównując ten indeks z indeksem aktualnie wybranego elementu.

Tworzenie menedżera wstępnego wczytywania

Aby utworzyć menedżera wstępnego wczytywania, potrzebujesz DefaultPreloadManager.Builder. Ten moduł jest skonfigurowany z bieżącym kontekstem i ustawieniem stanu wstępnego wczytywania aplikacji. Możesz utworzyć menedżera wstępnego wczytywania ze wszystkimi domyślnymi konfiguracjami.

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

Generator udostępnia też metody ustawiające, których możesz użyć do ustawienia niestandardowych komponentów menedżera wstępnego wczytywania.

Możesz na przykład dostosować docelową łączną liczbę bajtów bufora dla wszystkich źródeł multimediów wstępnego wczytywania w DefaultPreloadManager, aby wstępnie wczytane dane nie przekraczały tego limitu. Możesz skonfigurować ten limit za pomocą parametru setPlayerTargetBufferBytes(String, int) w niestandardowym parametrze DefaultLoadControl.Builder z nazwą odtwarzacza "preload" i przekazać tę instancję do narzędzia do tworzenia menedżera wstępnego wczytywania:

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()

Metody ustawiające w konstruktorze są opcjonalne w przypadku dostosowywania, ale jeśli chcesz buforować na dysku elementy multimedialne, musisz skonfigurować konstruktor za pomocą Cache, wywołując setCache(). Jeśli nie skonfigurowano pamięci podręcznej, próba zapisania w niej elementów multimedialnych spowoduje błąd IllegalStateException.

Utwórz ExoPlayer, aby odtworzyć wstępnie wczytany element multimedialny

Za pomocą kreatora utworzysz nie tylko menedżera wstępnego wczytywania, ale też obiekty ExoPlayer, których aplikacja używa do odtwarzania treści. Dzięki temu komponent ExoPlayer będzie prawidłowo udostępniać komponenty menedżerowi wstępnego wczytywania. Nadal możesz ustawić konfiguracje odtwarzania dla ExoPlayer, przekazując instancję ExoPlayer.Builder z tymi konfiguracjami.

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

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