Administra y reproduce contenido

En esta página, se describe cómo usar un administrador de precarga para administrar contenido de video. Si usas un administrador de precarga, puedes brindar una mejor experiencia al usuario. Cuando el usuario cambia de un elemento multimedia a otro, la reproducción comienza más rápido porque el administrador ya cargó parte del contenido.

En esta página, se tratan los siguientes temas:

Cómo agregar elementos multimedia al administrador de carga previa

Debes informarle al administrador de precarga sobre cada elemento multimedia que hará un seguimiento. Por ejemplo, si tu app tiene un carrusel de videos, debes agregar esos videos al administrador de precarga. Según tu caso de uso, puedes agregar todos los videos o solo los que están cerca del video que se está reproduciendo. También puedes agregar elementos nuevos al administrador de precarga más adelante.

Agregar los elementos multimedia no hace que el administrador de precarga comience a cargar el contenido. Para activar la precarga, deberás invalidar las prioridades en el administrador de precarga.

val initialMediaItems = pullMediaItemsFromService(count = 20)
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems[index], /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

Puntos clave sobre el código

  • En este fragmento, se muestra cómo propagar inicialmente el administrador de precarga después de crearlo. También puedes llamar a add() para agregar elementos a un administrador de precarga existente y propagado.
  • En este fragmento, pullMediaItemsFromService() es la lógica de la app para recuperar la lista de contenido que se reproducirá. El código llama a ese método para recuperar una lista de hasta 20 elementos.
  • preloadManager es el DefaultPreloadManager creado en Cómo crear un DefaultPreloadManager. El código llama al método add() de ese administrador para agregar cada elemento del carrusel.
  • rankingData es un valor que usa el administrador de precarga para determinar la prioridad de cada elemento multimedia. Para DefaultPreloadManager, rankingData es un número entero que representa la posición del elemento en el carrusel. El administrador de carga previa determina la prioridad según la distancia de cada elemento con respecto al elemento que se está reproduciendo.

Cómo invalidar las prioridades en el administrador de carga previa

Para activar el administrador de precarga para que comience a precargar contenido, debes llamar a invalidate() para informarle que las prioridades de los elementos están desactualizadas. Debes hacerlo en las siguientes situaciones:

  • Cuando agregas elementos multimedia nuevos al administrador de precarga o quitas elementos multimedia. Si agregas o quitas varios elementos, debes agregarlos todos y, luego, llamar a invalidate().
  • Cuando el usuario cambia de un elemento multimedia a otro. En este caso, debes asegurarte de actualizar el índice de reproducción actual antes de llamar a invalidate(), como se describe en Cómo recuperar y reproducir contenido.

Cuando invalidas el administrador de precarga, este llama al TargetPreloadStatusControl que creaste para averiguar cuánto contenido debe cargar de cada elemento. Luego, carga el contenido de cada elemento en el orden de su prioridad, de mayor a menor.

preloadManager.invalidate()

Puntos clave sobre el código

  • Llamar a invalidate() activa el administrador de precarga para que vuelva a evaluar la prioridad de cada elemento multimedia que conoce. Por este motivo, si realizas muchos cambios en el administrador de precarga, debes terminar de hacer los cambios antes de llamar a invalidate().

Cómo recuperar y reproducir contenido multimedia

Cuando el usuario avanza a un elemento multimedia nuevo, debes obtenerlo del administrador de carga previa. Si el administrador de precarga cargó parte del contenido, este se reproduce más rápido que si no lo hubieras usado. Si el administrador de precarga aún no cargó contenido de ese elemento, el contenido se reproduce con normalidad.

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If mediaSource is null, that mediaItem hasn't been added to the preload manager
  // yet. So, send it directly to the player when it's about to play
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

Puntos clave sobre el código

  • player es el Media3 ExoPlayer que usa la app para reproducir el contenido. Debes crear ese reproductor llamando a DefaultPreloadManager.Builder.buildExoPlayer() en el mismo compilador que usaste para crear el administrador de precarga.
  • Cuando el usuario cambia a un elemento multimedia nuevo, la app llama a getMediaSource() para obtener la fuente de contenido multimedia del administrador de carga previa. Debe ser un mediaItem que ya hayas agregado al administrador de precarga. No hay problema si el administrador de precarga aún no comenzó a cargar el contenido. En ese caso, muestra un MediaSource que no tiene datos precargados. Por ejemplo, esto puede ocurrir si el usuario salta repentinamente hacia adelante en el carrusel.
  • Después de que el usuario reproduzca el nuevo elemento multimedia, llama a setCurrentPlayingIndex para informarle al administrador de precarga en qué lugar del carrusel se encuentra el elemento nuevo. El administrador de precarga necesita esa información para priorizar la carga del siguiente elemento. Después de actualizar el índice actual, llama a invalidate() para que el administrador de precarga vuelva a determinar la prioridad de cada elemento.

Cómo quitar elementos del administrador de carga previa

Para que el administrador de precarga sea eficiente, debes quitar los elementos que el administrador de precarga ya no necesita hacer un seguimiento. También puedes quitar los elementos que aún están en el carrusel, pero que están lejos de la posición actual del usuario. Por ejemplo, puedes decidir que, si un elemento está a más de 15 elementos de lo que está mirando el usuario, no es necesario cargarlo previamente. En ese caso, quitarías los elementos cuando se alejaran tanto. Si el usuario vuelve a acercarse a esos elementos quitados, siempre puedes volver a agregarlos.

preloadManager.remove(mediaItem)

Puntos clave sobre el código

Cómo liberar el administrador de precarga cuando termines de usarlo

Cuando ya no necesites el administrador de precarga, debes liberarlo para liberar sus recursos. En particular, asegúrate de liberarlo cuando se destruya tu actividad.

preloadManager.release()

Puntos clave sobre el código

  • No debes llamar a ninguno de los métodos del objeto después de liberarlo.
  • Si necesitas crear otro administrador de carga previa, crea un nuevo DefaultPreloadManager.Builder y úsalo para crear el DefaultPreloadManager. No intentes reutilizar el compilador anterior.