En el caso de los casos de uso simples, comenzar a usar ExoPlayer
consiste en implementar los siguientes pasos:
- Agrega ExoPlayer como una dependencia a tu proyecto.
- Crea una instancia de
ExoPlayer
. - Adjunta el reproductor a una vista (para la salida de video y la entrada del usuario).
- Prepara al jugador con un
MediaItem
para jugar. - Suelta el reproductor cuando termines.
Estos pasos se describen con más detalle a continuación. Para obtener un ejemplo completo, consulta PlayerActivity
en la app de demostración principal.
Agrega ExoPlayer como una dependencia
Agrega módulos de ExoPlayer
La forma 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 de DASH y componentes de IU, puedes agregar dependencias en los módulos de la siguiente manera:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.5.0") implementation("androidx.media3:media3-exoplayer-dash:1.5.0") implementation("androidx.media3:media3-ui:1.5.0")
Groovy
implementation "androidx.media3:media3-exoplayer:1.5.0" implementation "androidx.media3:media3-exoplayer-dash:1.5.0" implementation "androidx.media3:media3-ui:1.5.0"
donde 1.5.0 es la versión que prefieras (consulta las notas de la versión para encontrar la versión más reciente). Todos los módulos deben tener la misma versión.
AndroidX Media3 tiene módulos de bibliotecas que dependen de bibliotecas externas para proporcionar funcionalidad adicional. Algunos están disponibles en el repositorio de Maven, mientras que otros se deben compilar de forma manual. Explora el directorio de bibliotecas y consulta los archivos README individuales para obtener más información.
Puedes encontrar más información sobre los módulos de biblioteca disponibles en la página de Google Maven AndroidX Media.
Cómo activar la compatibilidad con Java 8
Si aún no lo hiciste, debes habilitar 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
}
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 para crear 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 gran mayoría de los casos, este debe ser el subproceso principal de la aplicación. Usar el 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 al que se debe acceder en 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 crea el reproductor o, si ese subproceso no tiene un Looper
, se usa el Looper
del subproceso principal de la aplicación. En todos los casos, el Looper
del subproceso desde el que se debe acceder al jugador se puede consultar con Player.getApplicationLooper
.
Para obtener más información sobre el modelo de subprocesos de ExoPlayer, consulta la sección "Modelo de subprocesos" de la documentación de Javadoc de ExoPlayer.
Cómo conectar el reproductor a una vista
La biblioteca de ExoPlayer proporciona una variedad de componentes de IU prediseñados para la reproducción de contenido multimedia. Entre los mencionados, se incluye PlayerView
, que encapsula un PlayerControlView
, un SubtitleView
y un Surface
en los que se renderiza el video. Se puede incluir un PlayerView
en el archivo XML del 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, lo que es útil para casos de uso de solo 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, se puede configurar el SurfaceView
, TextureView
, SurfaceHolder
o Surface
de destino con los métodos setVideoSurfaceView
, setVideoTextureView
, setVideoSurfaceHolder
y setVideoSurface
de ExoPlayer, respectivamente. El método addTextOutput
de ExoPlayer se puede usar para recibir subtítulos que se deben renderizar durante la reproducción.
Completa la playlist y prepara el reproductor
En ExoPlayer, cada elemento multimedia está representado por un MediaItem
. Para reproducir un elemento multimedia, debes compilar un MediaItem
correspondiente, agregarlo al reproductor, prepararlo 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 playlists directamente, 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 propagar y manipular la playlist 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, se puede controlar la reproducción llamando a métodos en el reproductor. Estos son algunos de los métodos más utilizados:
play
ypause
inician y pausan la reproducción.seekTo
permite buscar dentro del contenido multimedia.hasPrevious
,hasNext
,previous
ynext
permiten navegar por la playlist.setRepeatMode
controla si se reproduce contenido multimedia en bucle y cómo se hace.setShuffleModeEnabled
controla la reproducción aleatoria de la playlist.setPlaybackParameters
ajusta la velocidad de reproducción y el tono de audio.
Si el reproductor está vinculado a un PlayerView
o PlayerControlView
, la interacción del usuario con estos componentes hará que se invoquen los métodos correspondientes en el reproductor.
Libera el jugador
Es importante liberar el reproductor cuando ya no sea necesario para liberar recursos limitados, como decodificadores de video, para que los usen otras aplicaciones. Para ello, llama a ExoPlayer.release
.