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. Darin wird jedes Medienelement mit einer Ganzzahl eingestuft, die seine Position in einer Liste angibt, z. B. seine Position in einem Videokarussell. Der Preload-Manager priorisiert das Laden der Elemente basierend darauf, wie nah sie an dem Element sind, das der Nutzer gerade abspielt. Wenn ein Nutzer zu einem anderen Element wechselt, kann das neue Element so sofort wiedergegeben werden.
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.
Steuerelement für den Zielvorladestatus 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, wie viele Inhalte geladen werden sollen. Die Statussteuerung kann mit einem der folgenden Statuscodes antworten:
STAGE_SPECIFIED_RANGE_LOADED
: Der Preload-Manager sollte die Inhalte ab der angegebenen Startposition und für die angegebene Dauer (in Millisekunden) laden.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 möglicherweise 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 (das nächste Media-Element): 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 Mediendateien im Bereich n–4 bis n+4: Rückgabe
PreloadStatus.SOURCE_PREPARED
- Geben Sie für alle anderen Medienelemente
null
zurück.
class MyTargetPreloadStatusControl(
currentPlayingIndex: Int = C.INDEX_UNSET
): 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.TRACKS_SELECTED
} else if (abs(index - currentPlayingIndex) <= 4) {
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
}
return null
}
}
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 Rankinginformationen, die Sie für das entsprechende Media-Element angegeben haben. Im Fall vonDefaultPreloadManager
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.
Preload 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. Der Builder bietet auch Setter-Methoden, mit denen Sie die benutzerdefinierten Komponenten des Preload-Managers festlegen können.
Mit dem Builder erstellen Sie nicht nur den Preload-Manager, sondern auch die ExoPlayer
-Objekte, die Ihre App zum Abspielen der Inhalte verwendet.
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
Wichtige Punkte zum Code
MyTargetPreloadStatusControl
ist die Klasse, die Sie unter Kontrollgruppe für den Vorab-Ladezustand eines Zielvorhabens erstellen definiert haben.- Sie verwenden dieselbe
DefaultPreloadManager.Builder
, um dieExoPlayer
-Objekte zu erstellen, mit denen Inhalte wiedergegeben werden, die von diesem Preload-Manager verwaltet werden.