Начало работы с медиаплеером

В этом документе представлены основные понятия, с которыми вам следует ознакомиться, прежде чем начать работу с Media Player.

Курсы по звуку и видео.

Следующие классы воспроизводят звук и видео в среде Android:

  • MediaPlayer : Этот класс является основным API для воспроизведения звука и видео.
  • AudioManager : Этот класс управляет источниками звука и выводом звука на устройстве.

Манифест-декларация

Прежде чем начать разработку приложения с использованием MediaPlayer, убедитесь, что ваш манифест содержит соответствующие объявления, разрешающие использование связанных функций.

  • Разрешение на доступ к интернету: Если вы используете MediaPlayer для потоковой передачи контента из сети, ваше приложение должно запросить доступ к сети.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Wake Lock Permission: If your player application needs to keep the screen from dimming or the processor from sleeping, or uses the MediaPlayer.setScreenOnWhilePlaying(boolean) or MediaPlayer.setWakeMode(android.content.Context, int) methods, you must request this permission.

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

Используйте класс MediaPlayer.

The MediaPlayer class is n essential component of the media framework. An object of this class can fetch, decode, and play both audio and video with minimal setup. MediaPlayer supports several media sources, including:

  • Местные ресурсы
  • Внутренние URI, например, тот, который вы можете получить от Content Resolver.
  • Внешние URL-адреса (потоковая передача)

Список поддерживаемых Android форматов мультимедиа можно найти на странице «Поддерживаемые форматы мультимедиа» .

Примеры работы с аудиоисточниками

Вот пример того, как воспроизвести аудиофайл, доступный в виде локального исходного ресурса (сохраненного в каталоге res/raw/ вашего приложения):

Котлин

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

In this case, a "raw" resource is a file that the system does not try to parse in any particular way. However, the content of this resource shouldn't be raw audio. It should be a properly encoded and formatted media file in one of the supported formats.

А вот как можно воспроизводить контент, используя URI, доступный локально в системе (например, полученный через Content Resolver):

Котлин

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

Воспроизведение с удалённого URL-адреса с использованием HTTP-стриминга выглядит следующим образом:

Котлин

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

Используйте асинхронную подготовку для повышения производительности.

При использовании MediaPlayer следует учитывать производительность. Например, вызов метода prepare() может занять много времени, поскольку он может включать в себя получение и декодирование медиаданных. Поэтому, как и любой метод, выполнение которого может занять много времени, никогда не вызывайте его из потока пользовательского интерфейса вашего приложения . Это приведет к тому, что пользовательский интерфейс перестанет отвечать до тех пор, пока метод не вернет результат, что негативно сказывается на пользовательском опыте и может вызвать ошибку ANR (Application Not Responding).

Чтобы избежать зависания потока пользовательского интерфейса, создайте еще один поток для подготовки MediaPlayer и уведомите основной поток о завершении. Фреймворк предоставляет удобный способ реализации этой задачи с помощью метода prepareAsync() . Этот метод запускает подготовку медиафайлов в фоновом режиме и немедленно возвращает управление. После завершения подготовки медиафайлов вызывается метод onPrepared() объекта MediaPlayer.OnPreparedListener , настроенный с помощью setOnPreparedListener() .

Узнать больше

Jetpack Media3 — рекомендуемое решение для воспроизведения мультимедиа в вашем приложении. Узнайте больше об этом.

На этих страницах рассматриваются вопросы, касающиеся записи, хранения и воспроизведения аудио- и видеоматериалов: