Для простых случаев использования начало работы с ExoPlayer
состоит из выполнения следующих шагов:
- Добавьте ExoPlayer как зависимость к вашему проекту.
- Создайте экземпляр
ExoPlayer
. - Прикрепите проигрыватель к представлению (для вывода видео и ввода данных пользователем).
- Подготовьте проигрыватель с
MediaItem
для воспроизведения. - Когда закончите, отпустите плеер.
Эти шаги более подробно описаны ниже. Полный пример см. в PlayerActivity
в основном демонстрационном приложении .
Добавить ExoPlayer как зависимость
Добавить модули ExoPlayer
Самый простой способ начать использовать AndroidX Media3 — добавить зависимости Gradle для необходимых библиотек в файле build.gradle
вашего модуля приложения.
Например, чтобы использовать ExoPlayer с поддержкой воспроизведения DASH и компонентами пользовательского интерфейса, вы можете добавить зависимости от модулей следующим образом:
Котлин
implementation("androidx.media3:media3-exoplayer:1.7.1") implementation("androidx.media3:media3-exoplayer-dash:1.7.1") implementation("androidx.media3:media3-ui:1.7.1") implementation("androidx.media3:media3-ui-compose:1.7.1")
Круто
implementation "androidx.media3:media3-exoplayer:1.7.1" implementation "androidx.media3:media3-exoplayer-dash:1.7.1" implementation "androidx.media3:media3-ui:1.7.1" implementation("androidx.media3:media3-ui-compose:1.7.1")
где 1.7.1 — предпочитаемая вами версия (последнюю версию можно найти в примечаниях к выпуску ). Все модули должны быть одной версии.
В AndroidX Media3 есть библиотечные модули, которые зависят от внешних библиотек для обеспечения дополнительной функциональности. Некоторые из них доступны в репозитории Maven, другие же необходимо собрать вручную. Подробности можно найти в каталоге библиотек и в отдельных файлах README.
Более подробную информацию о доступных модулях библиотеки можно найти на странице Google Maven AndroidX Media .
Включить поддержку Java 8
Если эта поддержка еще не включена, вам необходимо включить как минимум поддержку Java 8 во всех файлах build.gradle
, которые зависят от ExoPlayer, добавив в раздел android
следующее:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Создайте игрока
Экземпляр ExoPlayer
можно создать с помощью ExoPlayer.Builder
, предоставляющего ряд возможностей настройки. Следующий код — простейший пример создания экземпляра.
Котлин
val player = ExoPlayer.Builder(context).build()
Ява
ExoPlayer player = new ExoPlayer.Builder(context).build();
Примечание о нитях
Доступ к экземплярам ExoPlayer должен осуществляться из одного потока приложения. В подавляющем большинстве случаев это должен быть основной поток приложения. Использование основного потока приложения является обязательным условием при использовании компонентов пользовательского интерфейса ExoPlayer или расширения IMA.
Поток, в котором должен быть осуществлен доступ к экземпляру ExoPlayer, можно явно указать, передав Looper
при создании проигрывателя. Если Looper
не указан, используется Looper
потока, в котором создан проигрыватель, или, если в этом потоке Looper
отсутствует, используется Looper
основного потока приложения. Во всех случаях Looper
потока, из которого должен быть осуществлен доступ к проигрывателю, можно запросить с помощью Player.getApplicationLooper
.
Дополнительную информацию о потоковой модели ExoPlayer см. в разделе «Потоковая модель» Javadoc ExoPlayer .
Прикрепить плеер к представлению
Библиотека ExoPlayer предоставляет ряд готовых компонентов пользовательского интерфейса для воспроизведения медиаконтента. К ним относятся PlayerView
, который инкапсулирует PlayerControlView
, SubtitleView
и Surface
, на котором отображается видео. PlayerView
можно включить в XML-макет вашего приложения. Например, чтобы привязать проигрыватель к представлению:
Котлин
// Bind the player to the view. playerView.player = player
Ява
// Bind the player to the view. playerView.setPlayer(player);
Использование готовых компонентов пользовательского интерфейса ExoPlayer необязательно. Для видеоприложений, реализующих собственный пользовательский интерфейс, целевые SurfaceView
, TextureView
, SurfaceHolder
или Surface
можно задать с помощью методов setVideoSurfaceView
, setVideoTextureView
, setVideoSurfaceHolder
и setVideoSurface
. Обратный вызов Listener.onCues
можно использовать для получения субтитров, которые должны отображаться во время воспроизведения, а setImageOutput
— для получения декодированных изображений.
Для более комфортного использования попробуйте добавить атрибут keepScreenOn
или настроить блокировку пробуждения на ExoPlayer . Вы также можете изучить другие действия, которые поддерживают устройство в активном состоянии на рабочих страницах в фоновом режиме .
android:keepScreenOn="true"
Подробнее об использовании компонентов пользовательского интерфейса Media3 и их настройке читайте на странице пользовательского интерфейса .
Заполнение плейлиста и подготовка плеера
В ExoPlayer каждый медиафайл представлен объектом MediaItem
. Чтобы воспроизвести медиафайл, необходимо создать соответствующий объект MediaItem
, добавить его в плеер, подготовить плеер и вызвать play
для начала воспроизведения:
Котлин
// Build the media item. val mediaItem = MediaItem.fromUri(videoUri) // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare() // Start the playback. player.play()
Ява
// Build the media item. MediaItem mediaItem = MediaItem.fromUri(videoUri); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare(); // Start the playback. player.play();
ExoPlayer напрямую поддерживает плейлисты, поэтому можно подготовить плеер с несколькими медиафайлами для последовательного воспроизведения:
Котлин
// Build the media items. val firstItem = MediaItem.fromUri(firstVideoUri) val secondItem = MediaItem.fromUri(secondVideoUri) // Add the media items to be played. player.addMediaItem(firstItem) player.addMediaItem(secondItem) // Prepare the player. player.prepare() // Start the playback. player.play()
Ява
// Build the media items. MediaItem firstItem = MediaItem.fromUri(firstVideoUri); MediaItem secondItem = MediaItem.fromUri(secondVideoUri); // Add the media items to be played. player.addMediaItem(firstItem); player.addMediaItem(secondItem); // Prepare the player. player.prepare(); // Start the playback. player.play();
Список воспроизведения можно обновлять во время воспроизведения без необходимости повторной подготовки проигрывателя. Подробнее о заполнении и изменении списка воспроизведения читайте на странице «Плейлисты» . Подробнее о различных параметрах, доступных при создании медиаэлементов, таких как вырезание и прикрепление файлов субтитров, читайте на странице «Элементы мультимедиа» .
Управляйте игроком
После подготовки проигрывателя воспроизведением можно управлять, вызывая его методы. Вот некоторые из наиболее часто используемых методов:
-
play
иpause
запуск и приостановка воспроизведения. -
seekTo
позволяет осуществлять поиск в медиафайлах. -
hasPrevious
,hasNext
,previous
иnext
позволяют перемещаться по плейлисту. -
setRepeatMode
управляет цикличностью воспроизведения мультимедиа и способом ее воспроизведения. -
setShuffleModeEnabled
управляет перемешиванием плейлистов. -
setPlaybackParameters
регулирует скорость воспроизведения и высоту звука.
Если проигрыватель привязан к PlayerView
или PlayerControlView
, то взаимодействие пользователя с этими компонентами приведет к вызову соответствующих методов проигрывателя.
Отпустите игрока
Важно завершать работу проигрывателя, когда он больше не нужен, чтобы освободить ограниченные ресурсы, такие как видеодекодеры, для использования другими приложениями. Это можно сделать, вызвав ExoPlayer.release
.