Administra y reproduce contenido

En esta página, se describe cómo usar un administrador de carga previa para administrar contenido de video. Si usas un administrador de carga previa, puedes brindarles a los usuarios una mejor experiencia. Cuando cambian 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 abordan los siguientes temas:

Agrega elementos multimedia al administrador de carga previa

Debes informar al administrador de carga previa sobre cada elemento multimedia que realizará el seguimiento. Por ejemplo, si tu app tiene un carrusel de videos, deberías agregarlos al administrador de carga previa. Según tu caso de uso, puedes agregar todos los videos o solo los que estén cerca del que se está reproduciendo. También puedes agregar elementos nuevos al administrador de carga previa más adelante.

Agregar los elementos multimedia no hace que el administrador de carga previa comience a cargar el contenido por sí solo. 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.get(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 completar inicialmente el administrador de carga previa después de crearlo. También puedes llamar a add() para agregar elementos a un administrador de carga previa existente y completo.
  • 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 Crea un DefaultPreloadManager. El código llama al método add() de ese administrador para agregar cada elemento del carrusel.
  • rankingData es un valor que el administrador de carga previa usa para determinar la prioridad de cada elemento multimedia. En 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.

Invalida las prioridades en el administrador de carga previa

Para activar el administrador de carga previa y que comience a cargar previamente el contenido, debes llamar a invalidate() para indicarle al administrador de carga previa que las prioridades de los elementos están desactualizadas. Debes hacerlo en las siguientes situaciones:

  • Cuando agregas o quitas elementos multimedia nuevos en el administrador de carga previa 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 carga previa, 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() hace que el administrador de carga previa vuelva a evaluar la prioridad de cada elemento multimedia que conoce. Por este motivo, si realizas muchos cambios en el administrador de carga previa, debes terminar de hacerlos antes de llamar a invalidate().

Cómo recuperar y reproducir contenido multimedia

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

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
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 objeto ExoPlayer de Media3 que usa la app para reproducir el contenido. Para crear ese reproductor, debes llamar a DefaultPreloadManager.Builder.buildExoPlayer() en el mismo compilador que usaste para crear el administrador de carga previa.
  • Cuando el usuario cambia a un nuevo elemento multimedia, la app llama a getMediaSource() para obtener la fuente de medios del administrador de carga previa. Debe ser un mediaItem que ya hayas agregado al administrador de carga previa. No hay problema si el administrador de carga previa aún no comenzó a cargar el contenido. En ese caso, devuelve un MediaSource que no tiene datos precargados. Por ejemplo, esto podría ocurrir si el usuario avanza de repente en el carrusel.
  • Después de que el usuario reproduce el nuevo elemento multimedia, llama a setCurrentPlayingIndex para indicarle al administrador de carga previa en qué lugar del carrusel se encuentra el elemento nuevo. El administrador de carga previa 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 carga previa vuelva a determinar la prioridad de cada elemento.

Cómo quitar elementos del administrador de carga previa

Para que el administrador de carga previa siga siendo eficiente, debes quitar los elementos que ya no necesite hacer un seguimiento. También puedes quitar elementos que aún se encuentren 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 distancia de lo que está mirando el usuario, no es necesario cargarlo previamente. En ese caso, quitarías los elementos cuando se alejaran lo suficiente. Si el usuario vuelve a acercarse a esos elementos quitados, siempre puedes volver a agregarlos.

preloadManager.remove(mediaItem)

Puntos clave sobre el código

Libera el administrador de carga previa cuando termines de usarlo

Cuando ya no necesites el administrador de carga previa, 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.