Premiers pas avec le lecteur multimédia

Ce document présente les concepts de base que vous devez connaître avant de travailler avec Media Player.

Cours sur le son et la vidéo

Les classes suivantes diffusent du son et de la vidéo dans le framework Android:

  • MediaPlayer: cette classe est l'API principale pour la lecture audio et vidéo.
  • AudioManager: cette classe gère les sources audio et la sortie audio sur un appareil.

Déclarations de fichier manifeste

Avant de commencer à développer votre application à l'aide de MediaPlayer, assurez-vous que votre fichier manifeste contient les déclarations appropriées pour permettre l'utilisation des fonctionnalités associées.

  • Autorisation Internet:si vous utilisez MediaPlayer pour diffuser du contenu en réseau, votre application doit demander l'accès au réseau.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Autorisation Wake Lock:si votre application de lecteur doit empêcher l'écran de s'assombrir ou le processeur de passer en veille, ou si elle utilise les méthodes MediaPlayer.setScreenOnWhilePlaying(boolean) ou MediaPlayer.setWakeMode(android.content.Context, int), vous devez demander cette autorisation.

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

Utiliser la classe MediaPlayer

La classe MediaPlayer est un composant essentiel du framework multimédia. Un objet de cette classe peut extraire, décoder et lire à la fois du contenu audio et vidéo avec une configuration minimale. MediaPlayer est compatible avec plusieurs sources multimédias, y compris les suivantes:

  • Ressources locales
  • URI internes, tels que ceux que vous pouvez obtenir à partir d'un Content Resolver
  • URL externes (streaming)

Pour obtenir la liste des formats multimédias compatibles avec Android, consultez la page Formats multimédias acceptés.

Exemples d'utilisation de sources audio

Voici un exemple de lecture d'un contenu audio disponible en tant que ressource brute locale (enregistrée dans le répertoire res/raw/ de votre application):

Kotlin

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

Java

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

Dans ce cas, une ressource "brute" est un fichier que le système n'essaie pas d'analyser de manière particulière. Toutefois, le contenu de cette ressource ne doit pas être de l'audio brut. Il doit s'agir d'un fichier multimédia correctement encodé et mis en forme dans l'un des formats compatibles.

Voici comment lire à partir d'un URI disponible localement dans le système (que vous avez obtenu via un Content Resolver, par exemple):

Kotlin

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

Java

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

La lecture à partir d'une URL distante à l'aide du streaming HTTP se présente comme suit:

Kotlin

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

Java

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

Utiliser la préparation asynchrone pour améliorer les performances

Tenez compte des performances lorsque vous utilisez MediaPlayer. Par exemple, l'exécution de l'appel à prepare() peut prendre beaucoup de temps, car elle peut impliquer l'extraction et le décodage de données multimédias. Par conséquent, comme pour toute méthode dont l'exécution peut prendre beaucoup de temps, n'appelez jamais cette méthode à partir du thread UI de votre application. Cela entraîne l'arrêt de la réponse de l'UI jusqu'à ce que la méthode renvoie une réponse, ce qui constitue une mauvaise expérience utilisateur et peut entraîner une erreur ANR (Application Not Responding).

Pour éviter de bloquer votre thread d'UI, créez un autre thread pour préparer MediaPlayer et informez le thread principal une fois terminé. Le framework fournit un moyen pratique d'exécuter la méthode prepareAsync() pour effectuer cette tâche. Cette méthode commence à préparer le contenu multimédia en arrière-plan et renvoie immédiatement. Lorsque le contenu multimédia est prêt, la méthode onPrepared() de MediaPlayer.OnPreparedListener, configurée via setOnPreparedListener(), est appelée.

En savoir plus

Jetpack Media3 est la solution recommandée pour la lecture multimédia dans votre application. En savoir plus

Ces pages traitent des sujets liés à l'enregistrement, au stockage et à la lecture d'audio et de vidéo: