В этом документе представлены основные понятия, с которыми вам следует ознакомиться, прежде чем начать работу с 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)orMediaPlayer.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 — рекомендуемое решение для воспроизведения мультимедиа в вашем приложении. Узнайте больше об этом.
На этих страницах рассматриваются вопросы, касающиеся записи, хранения и воспроизведения аудио- и видеоматериалов: