Lire des fichiers audio et vidéo
Lecture multimédia simple dans Android.
Lire des fichiers audio et vidéo est une leçon Android Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Android Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Android Academy comprend 4 leçons au total.
Au-delà des images : lecture multimédia
Coil affiche très bien les images, mais les applications lisent également du son et des vidéos : son de notification, podcast, clip en arrière-plan ou fil vidéo. Android dispose d'API dédiées aux contenus multimédias.
La bibliothèque moderne recommandée est Media3 (ExoPlayer). Elle gère bien mieux la diffusion en continu, les formats, la mise en mémoire tampon et les commandes de lecture que l'ancien MediaPlayer. Dans cette leçon, vous lirez de l'audio et de la vidéo simples dans une application Compose.
Ajouter les dépendances Media3
Media3 est réparti en modules. Pour la plupart des applications, vous aurez besoin de media3-exoplayer (le moteur de lecture) et de media3-ui (des vues de lecteur prêtes à l'emploi). Pour la vidéo Compose, vous pouvez également utiliser PlayerView via AndroidView.
// build.gradle.kts (module level)
dependencies {
implementation("androidx.media3:media3-exoplayer:1.5.0")
implementation("androidx.media3:media3-ui:1.5.0")
}Créer un ExoPlayer
Un ExoPlayer est créé à partir d'un Context. Vous lui fournissez un MediaItem (une URL ou un fichier local), appelez prepare(), puis démarrez la lecture. Il utilise ses propres fils d'exécution et ne bloque donc pas l'interface utilisateur.
Point essentiel : un lecteur conserve des ressources système et doit être libéré. Nous y reviendrons bientôt.
import android.content.Context
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
fun createPlayer(context: Context, url: String): ExoPlayer {
val player = ExoPlayer.Builder(context).build()
player.setMediaItem(MediaItem.fromUri(url))
player.prepare()
player.playWhenReady = true
return player
}Lire de l'audio
Pour une lecture audio uniquement, la configuration est identique : il suffit de faire pointer MediaItem vers une URL audio (mp3, aac, etc.). Il n'y a aucune vue à afficher, vous le contrôlez donc via l'objet lecteur : play(), pause(), seekTo().
Cela suffit pour créer un lecteur de podcasts ou de musique.
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
fun playPodcast(player: ExoPlayer, audioUrl: String) {
player.setMediaItem(MediaItem.fromUri(audioUrl))
player.prepare()
player.play()
}
fun togglePause(player: ExoPlayer) {
if (player.isPlaying) player.pause() else player.play()
}Mémoriser le lecteur dans Compose
Dans Compose, vous devez créer le lecteur une seule fois et le conserver entre les recompositions. Utilisez remember afin de ne pas créer un nouveau lecteur à chaque recomposition.
Associez cette approche à un nettoyage correct (scène suivante) pour éviter les fuites de ressources.
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
@Composable
fun rememberPlayer(url: String): ExoPlayer {
val context = LocalContext.current
return remember {
ExoPlayer.Builder(context).build().apply {
setMediaItem(MediaItem.fromUri(url))
prepare()
}
}
}Libérer le lecteur
Un lecteur maintient actifs les codecs, les tampons et le focus audio. Si vous oubliez de le libérer, vous provoquez une fuite de mémoire et la lecture peut continuer après la disparition de l'écran. Dans Compose, DisposableEffect effectue le nettoyage lorsque le composable quitte la composition.
Appelez toujours player.release() à cet endroit.
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.media3.exoplayer.ExoPlayer
@Composable
fun ManagedPlayer(player: ExoPlayer) {
DisposableEffect(player) {
onDispose {
player.release()
}
}
// ... use player here
}Afficher une vidéo avec PlayerView
Media3 fournit un PlayerView prêt à l'emploi avec des commandes. Compose ne possède pas de composable vidéo natif ; vous intégrez donc la vue à l'aide de AndroidView et lui associez le lecteur.
Vous bénéficiez ainsi gratuitement des commandes lecture/pause, d'une barre de progression et du plein écran.
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView
@Composable
fun VideoPlayer(player: ExoPlayer, modifier: Modifier = Modifier) {
AndroidView(
factory = { context ->
PlayerView(context).apply {
this.player = player
}
},
modifier = modifier
)
}Un écran vidéo complet
Rassemblons tout cela : créez le lecteur, mémorisez-le, associez-le à un PlayerView et libérez-le lors de la suppression. Vous obtenez un écran vidéo autonome et réutilisable.
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView
@Composable
fun VideoScreen(videoUrl: String) {
val context = LocalContext.current
val player = remember {
ExoPlayer.Builder(context).build().apply {
setMediaItem(MediaItem.fromUri(videoUrl))
prepare()
playWhenReady = true
}
}
DisposableEffect(Unit) { onDispose { player.release() } }
AndroidView(
factory = { PlayerView(it).apply { this.player = player } },
modifier = Modifier.fillMaxWidth().height(220.dp)
)
}Suivre l'état de lecture
Pour mettre à jour votre interface (une icône de lecture/pause ou une barre de progression), écoutez le lecteur avec un Player.Listener. Celui-ci signale les changements d'état, comme la mise en mémoire tampon, l'état prêt et la fin de la lecture, ainsi que l'activation ou non de la lecture.
Ajoutez l'écouteur lorsque l'écran apparaît et supprimez-le lors de sa suppression.
import androidx.media3.common.Player
import androidx.media3.exoplayer.ExoPlayer
fun observe(player: ExoPlayer, onPlaying: (Boolean) -> Unit): Player.Listener {
val listener = object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
onPlaying(isPlaying)
}
override fun onPlaybackStateChanged(state: Int) {
when (state) {
Player.STATE_BUFFERING -> { /* show spinner */ }
Player.STATE_READY -> { /* ready */ }
Player.STATE_ENDED -> { /* finished */ }
}
}
}
player.addListener(listener)
return listener
}Mettre en pause lorsque l'application passe en arrière-plan
Pour une vidéo intégrée (et non une application musicale), vous souhaitez généralement mettre la lecture en pause lorsque l'utilisateur quitte l'écran, puis la reprendre à son retour. Vous pouvez associer la lecture au cycle de vie de Compose en observant Lifecycle et en mettant la lecture en pause sur ON_PAUSE.
Cela évite de lire une vidéo que l'utilisateur ne peut pas voir et économise la batterie.
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.media3.exoplayer.ExoPlayer
@Composable
fun PauseWithLifecycle(player: ExoPlayer) {
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_PAUSE -> player.pause()
Lifecycle.Event.ON_RESUME -> player.play()
else -> {}
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
}
}Audio en arrière-plan avec MediaSession
Pour un contenu audio qui doit continuer à être lu lorsque l'application passe en arrière-plan (musique, podcasts), encapsulez la lecture dans un MediaSessionService. Cela l'intègre aux commandes système, à l'écran de verrouillage et aux boutons Bluetooth.
La mise en place est plus complexe, mais l'idée centrale consiste à exposer votre lecteur via une MediaSession.
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.session.MediaSession
import androidx.media3.session.MediaSessionService
class PlaybackService : MediaSessionService() {
private var session: MediaSession? = null
override fun onCreate() {
super.onCreate()
val player = ExoPlayer.Builder(this).build()
session = MediaSession.Builder(this, player).build()
}
override fun onGetSession(controllerInfo: MediaSession.ControllerInfo) = session
override fun onDestroy() {
session?.run { player.release(); release() }
session = null
super.onDestroy()
}
}Vérification rapide
Dans un écran Compose qui contient un ExoPlayer, quelle API Compose devez-vous utiliser pour libérer le lecteur lorsque l'écran quitte la composition ?
Récapitulatif
Vous avez ajouté la lecture audio et vidéo :
- Utilisez Media3 ExoPlayer, le remplacement moderne de MediaPlayer.
- Créez un lecteur, définissez un
MediaItem, appelezprepare(), puisplay(). - Dans Compose, mémorisez le lecteur avec
rememberet libérez-le dansDisposableEffect, viaonDispose. - Affichez la vidéo en intégrant
PlayerViewavecAndroidView. - Suivez l'état avec un
Player.Listeneret utilisez unMediaSessionServicepour l'audio en arrière-plan.
Le cours Images et chargement multimédia avec Coil est terminé. Vous pouvez maintenant charger des images fluidement et lire des contenus multimédias avec les approches Android modernes.
Apprends Kotlin avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 36
- Leçons
- 152
Questions Fréquemment Posées
La leçon « Lire des fichiers audio et vidéo » est-elle gratuite ?
Oui — le texte complet de « Lire des fichiers audio et vidéo » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Android Academy, passe à CoddyKit PRO. Le cours Android Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Lire des fichiers audio et vidéo » ?
Lecture multimédia simple dans Android. Tu pratiques Android Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Android Academy ?
Aucune expérience préalable n'est requise. Android Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Lire des fichiers audio et vidéo » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Android Academy ?
Oui. Chaque leçon Android Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Charger des images avec Coil
- Espaces réservés et états d’erreur
- Mise en cache et performances
- Lire des fichiers audio et vidéo