Primeros pasos

En casos de uso simples, comenzar a usar ExoPlayer consiste en implementar los siguientes pasos:

  1. Agrega ExoPlayer como una dependencia a tu proyecto.
  2. Crea una instancia de ExoPlayer.
  3. Adjunta el reproductor a una vista (para salida de video y entrada del usuario).
  4. Prepara el reproductor con un MediaItem para jugar.
  5. Suelta el reproductor cuando hayas terminado.

Estos pasos se describen con más detalle a continuación. Para obtener un ejemplo completo, consulta PlayerActivity en la app de demo principal.

Agrega ExoPlayer como dependencia

Agrega módulos de ExoPlayer

La manera más fácil de comenzar a usar AndroidX Media3 es agregar dependencias de Gradle en las bibliotecas que necesitas en el archivo build.gradle del módulo de tu app.

Por ejemplo, para depender de ExoPlayer con compatibilidad con la reproducción DASH y los componentes de la IU, puedes agregar dependencias en los módulos de la siguiente manera:

Kotlin

implementation("androidx.media3:media3-exoplayer:1.3.1")
implementation("androidx.media3:media3-exoplayer-dash:1.3.1")
implementation("androidx.media3:media3-ui:1.3.1")

Groovy

implementation "androidx.media3:media3-exoplayer:1.3.1"
implementation "androidx.media3:media3-exoplayer-dash:1.3.1"
implementation "androidx.media3:media3-ui:1.3.1"

en la que 1.3.1 es tu versión preferida (puedes encontrar la última versión consultando las notas de la versión). Todos los módulos deben tener la misma versión.

AndroidX Media3 tiene módulos de biblioteca que dependen de bibliotecas externas para proporcionar funciones adicionales. Algunos están disponibles en el repositorio de Maven, mientras que otros deben compilarse manualmente. Explora el directorio de bibliotecas y consulta archivos README individuales para obtener más detalles.

Puedes encontrar más información sobre los módulos de biblioteca disponibles en la página de Maven para AndroidX Media de Google.

Cómo activar la compatibilidad con Java 8

Si aún no está habilitada, debes activar la compatibilidad con Java 8 en todos los archivos build.gradle que dependen de ExoPlayer. Para ello, agrega lo siguiente a la sección android:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Cómo habilitar multidex

Si tu minSdkVersion de Gradle es 20 o anterior, debes habilitar multidex para evitar errores de compilación.

Crea el reproductor

Puedes crear una instancia de ExoPlayer con ExoPlayer.Builder, que proporciona una variedad de opciones de personalización. El siguiente código es el ejemplo más simple de la creación de una instancia.

Kotlin

val player = ExoPlayer.Builder(context).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();

Nota sobre los subprocesos

Se debe acceder a las instancias de ExoPlayer desde un solo subproceso de la aplicación. En la mayoría de los casos, este debería ser el subproceso principal de la aplicación. El uso del subproceso principal de la aplicación es un requisito cuando se usan los componentes de la IU de ExoPlayer o la extensión de IMA.

El subproceso en el que se debe acceder a una instancia de ExoPlayer se puede especificar de forma explícita pasando un Looper cuando se crea el reproductor. Si no se especifica un Looper, se usa el Looper del subproceso en el que se creó el jugador. Si ese subproceso no tiene un Looper, se usa el Looper del subproceso principal de la aplicación. En todos los casos, se puede consultar el Looper del subproceso desde el que se debe acceder al reproductor usando Player.getApplicationLooper.

Para obtener más información sobre el modelo de subprocesos de ExoPlayer, consulta la sección "Modelo de subprocesos" del Javadoc de ExoPlayer.

Cómo adjuntar el reproductor a una vista

La biblioteca de ExoPlayer proporciona un rango de componentes de IU compilados previamente para la reproducción de contenido multimedia. Entre ellos, se incluye PlayerView, que encapsula un PlayerControlView, un SubtitleView y un Surface en el que se renderiza el video. Se puede incluir un PlayerView en el XML de diseño de tu aplicación. Por ejemplo, para vincular el reproductor a la vista, haz lo siguiente:

Kotlin

// Bind the player to the view.
playerView.player = player

Java

// Bind the player to the view.
playerView.setPlayer(player);

También puedes usar PlayerControlView como un componente independiente, que es útil para casos de uso solo de audio.

El uso de los componentes de la IU precompilados de ExoPlayer es opcional. En el caso de las apps de video que implementan su propia IU, los destinos SurfaceView, TextureView, SurfaceHolder o Surface se pueden configurar con los métodos setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder y setVideoSurface de ExoPlayer, respectivamente. Se puede usar el método addTextOutput de ExoPlayer para recibir subtítulos que deben renderizarse durante la reproducción.

Completa la playlist y prepara el reproductor

En ExoPlayer, cada elemento multimedia se representa con un MediaItem. Para reproducir contenido multimedia, debes compilar un MediaItem correspondiente, agregarlo al reproductor, preparar el reproductor y llamar a play para iniciar la reproducción:

Kotlin

// Build the media item.
val mediaItem = MediaItem.fromUri(videoUri)
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

Java

// Build the media item.
MediaItem mediaItem = MediaItem.fromUri(videoUri);
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.prepare();
// Start the playback.
player.play();

ExoPlayer admite directamente playlists, por lo que es posible preparar el reproductor con varios elementos multimedia para que se reproduzcan uno tras otro:

Kotlin

// Build the media items.
val firstItem = MediaItem.fromUri(firstVideoUri)
val secondItem = MediaItem.fromUri(secondVideoUri)
// Add the media items to be played.
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

Java

// Build the media items.
MediaItem firstItem = MediaItem.fromUri(firstVideoUri);
MediaItem secondItem = MediaItem.fromUri(secondVideoUri);
// Add the media items to be played.
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);
// Prepare the player.
player.prepare();
// Start the playback.
player.play();

La playlist se puede actualizar durante la reproducción sin necesidad de volver a preparar el reproductor. Obtén más información para completar y manipular las playlists en la página Playlists. Obtén más información sobre las diferentes opciones disponibles cuando compilas elementos multimedia, como recortar y adjuntar archivos de subtítulos, en la página Elementos multimedia.

Cómo controlar el reproductor

Una vez que se prepara el reproductor, la reproducción se puede controlar invocando métodos en el reproductor. Estos son algunos de los métodos más usados:

  • play y pause inician y pausan la reproducción.
  • seekTo permite buscar dentro del contenido multimedia.
  • hasPrevious, hasNext, previous y next permiten navegar por la playlist.
  • setRepeatMode controla si se repite el contenido multimedia y de qué manera.
  • setShuffleModeEnabled controla la reproducción aleatoria de playlists.
  • setPlaybackParameters ajusta la velocidad de reproducción y el tono del audio.

Si el jugador está vinculado a un PlayerView o un PlayerControlView, la interacción del usuario con estos componentes hará que se invoquen los métodos correspondientes en el reproductor.

Suelta el reproductor

Es importante liberar el reproductor cuando ya no se necesita para liberar recursos limitados, como los decodificadores de video, para que los usen otras aplicaciones. Para ello, llama a ExoPlayer.release.