En esta página, se describe cómo crear un DefaultPreloadManager, que precarga
contenido multimedia para tu app según la estrategia que elijas.
Los administradores de precarga basados en la clase abstracta BasePreloadManager te permiten
clasificar el contenido según los criterios que elijas. En este documento, se explica cómo usar la clase derivada DefaultPreloadManager, en la que cada elemento multimedia se clasifica con un número entero que representa su ubicación en una lista (por ejemplo, su posición en un carrusel de videos). El administrador de precarga prioriza la carga de los elementos según la proximidad al elemento que el usuario está reproduciendo en ese momento. De esa manera, si un usuario pasa a otro elemento, el nuevo elemento puede comenzar a reproducirse de inmediato.
Para crear una instancia de DefaultPreloadManager, sigue estos tres pasos:
- Define un
TargetPreloadStatusControlque el administrador de precarga pueda consultar para saber si el elemento multimedia está listo para cargarse y cuánto cargar. - Crea el compilador que usarás para crear el administrador de precarga y
los objetos
ExoPlayerde tu app. - Usa el compilador para crear el administrador de precarga llamando al método
build()del compilador.
Crea un control de estado de precarga de destino
Cuando crees el DefaultPreloadManager.Builder, le pasarás un objeto
control de estado de precarga de destino que definas. Este objeto implementa
la TargetPreloadStatusControl interfaz. Cuando el administrador de precarga se
prepara para precargar contenido multimedia, llama al método
getTargetPreloadStatus() de tu control de estado para saber cuánto contenido cargar. El control de estado puede responder con uno de estos códigos de estado:
STAGE_SPECIFIED_RANGE_LOADED: El administrador de precarga debe cargar el contenido desde la posición de inicio especificada y durante la duración especificada (en milisegundos).STAGE_TRACKS_SELECTED: El administrador de precarga debe cargar y procesar la información de la pista de contenido y seleccionar las pistas. El administrador de precarga aún no debe comenzar a cargar el contenido.STAGE_SOURCE_PREPARED: El administrador de precarga debe preparar la fuente de contenido. Por ejemplo, si los metadatos del contenido están en un archivo de manifiesto independiente, el administrador de precarga podría recuperar y analizar ese manifiesto.null: El administrador de precarga no debe cargar ningún contenido ni metadatos para ese elemento multimedia.
Deberás tener una estrategia para decidir cuánto contenido cargar para cada elemento multimedia. En este ejemplo, se carga más contenido para los elementos más cercanos al elemento que se está reproduciendo. Si el usuario está reproduciendo contenido con el índice n, el controlador muestra los siguientes códigos:
- Índice n+1 (el siguiente elemento multimedia): Carga 3,000 ms (3 segundos) desde la posición de inicio predeterminada.
- Índice n-1 (el elemento multimedia anterior): Carga 1,000 ms (1 segundo) desde la posición de inicio predeterminada.
- Otros elementos multimedia en el rango n-2 a n+2: Muestra
PreloadStatus.TRACKS_SELECTED - Otros elementos multimedia en el rango n-4 a n+4: Muestra
PreloadStatus.SOURCE_PREPARED - Para todos los demás elementos multimedia, muestra
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 } }
Puntos clave sobre el código
- Pasarás una instancia de
MyTargetPreloadStatusControlal compilador del administrador de precarga cuando la crees. currentPlayingIndexcontiene el índice de cualquier elemento multimedia que se esté reproduciendo en ese momento. Es tarea de la app mantener ese valor actualizado.- Cuando el administrador de precarga esté listo para cargar contenido, llamará a
getTargetPreloadStatusy pasará la información de clasificación que especificaste para ese elemento multimedia correspondiente. En el caso deDefaultPreloadManager, esa información de clasificación es un número entero que especifica la posición del elemento en un carrusel. El método elige qué código mostrar comparando ese índice con el índice del elemento seleccionado en ese momento.
Crea el administrador de precarga
Para crear tu administrador de precarga, necesitas un DefaultPreloadManager.Builder.
Ese compilador se configura con el contexto actual y el control de estado de precarga de destino de la app. El compilador también proporciona métodos setter que puedes usar para configurar los componentes personalizados del administrador de precarga.
Además de usar el compilador para crear el administrador de precarga, también lo usarás para crear los ExoPlayer objetos que usa tu app para reproducir el contenido.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
Puntos clave sobre el código
MyTargetPreloadStatusControles la clase que definiste en Crea un control de estado de precarga de destino.- Usarás el mismo
DefaultPreloadManager.Builderpara crear los objetosExoPlayerque reproducirán el contenido administrado por ese administrador de precarga.