Comienza a usar el Reproductor multimedia

En este documento, se presentan los conceptos básicos con los que debes familiarizarte antes de trabajar con Media Player.

Clases de sonido y video

Las siguientes clases reproducen sonido y video en el marco de trabajo de Android:

  • MediaPlayer: Esta clase es la API principal para reproducir sonido y video.
  • AudioManager: Esta clase administra las fuentes de audio y la salida de audio en un dispositivo.

Declaraciones del manifiesto

Antes de comenzar a desarrollar tu app con MediaPlayer, asegúrate de que el manifiesto contenga las declaraciones adecuadas para permitir el uso de funciones relacionadas.

  • Permiso de Internet: Si estás usando MediaPlayer para transmitir contenido basado en la red, tu app debe solicitar acceso a la red.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Permiso de bloqueo de activación: Si la app del reproductor debe evitar que la pantalla se oscurezca o que el procesador entre en suspensión, o si utiliza los MediaPlayer.setScreenOnWhilePlaying(boolean) o MediaPlayer.setWakeMode(android.content.Context, int) métodos, debes solicitar este permiso.

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

Usa la clase MediaPlayer

La clase MediaPlayer es un componente esencial del marco de trabajo de medios. Un objeto de esta clase puede recuperar, decodificar y reproducir audio y video con una configuración mínima. MediaPlayer admite varias fuentes de medios, incluidas las siguientes:

  • Recursos locales
  • URI internos, como uno que se pueda obtener de un agente de resolución de contenido
  • URL externas (transmisión)

Para obtener una lista de los formatos de medios compatibles con Android, consulta la página Formatos de medios compatibles.

Ejemplos de cómo trabajar con fuentes de audio

A continuación, se muestra un ejemplo de cómo reproducir un archivo de audio que está disponible como recurso local sin procesar (guardado en el directorio res/raw/ de tu app):

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

En este caso, un recurso "sin procesar" es un archivo que el sistema no intenta analizar de ninguna manera en particular. Sin embargo, el contenido de este recurso no debe ser audio sin formato. Debe ser un archivo multimedia con el formato y la codificación adecuados en uno de los formatos admitidos.

A continuación, se muestra cómo puedes reproducir desde un URI disponible de forma local en el sistema (que obtuviste mediante un agente de resolución de contenido, por ejemplo):

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 reproducción desde una URL remota a través de la transmisión HTTP tiene el siguiente aspecto:

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();

Usa la preparación asíncrona para mejorar el rendimiento

Ten en cuenta el rendimiento cuando uses MediaPlayer. Por ejemplo, la llamada a prepare() puede tardar mucho tiempo en ejecutarse, ya que puede implicar la obtención y decodificación de datos multimedia. Por lo tanto, como en el caso de cualquier método que pueda tardar mucho tiempo en ejecutarse, nunca debes llamarlo desde el subproceso de IU de tu app. Si haces eso, la IU deja de responder hasta que el método muestre resultados, lo que constituye una experiencia de usuario muy mala y puede causar un error ANR (aplicación no responde).

Para evitar colgar el subproceso de IU, genera otro para preparar el MediaPlayer y notifica al subproceso principal cuando haya terminado. El framework proporciona una forma conveniente de realizar el prepareAsync() método para realizar esta tarea. Este método comienza a preparar los medios en segundo plano y los muestra de inmediato. Cuando termina la preparación de los medios, se llama al método onPrepared() de MediaPlayer.OnPreparedListener, que se configuró a través setOnPreparedListener().

Más información

Jetpack Media3 es la solución recomendada para la reproducción de contenido multimedia en tu app. Obtén más información al respecto.

En estas páginas, se analizan temas relacionados con la grabación, el almacenamiento y la reproducción de audio y video: