Чтобы начать использовать ExoPlayer в простых случаях, выполните следующие действия:
- Добавьте ExoPlayer в качестве зависимости в свой проект.
- Создайте экземпляр
ExoPlayer. - Прикрепите проигрыватель к представлению (для вывода видео и ввода данных пользователем).
- Подготовьте проигрыватель с
MediaItemк воспроизведению. - Когда закончите, отпустите проигрыватель.
Эти шаги подробно описаны ниже. Полный пример можно найти в операции PlayerActivity основного демонстрационного приложения.
Как добавить ExoPlayer в качестве зависимости
Как добавить модули ExoPlayer
Чтобы начать использовать AndroidX Media3, добавьте зависимости Gradle для нужных библиотек в файл build.gradle модуля приложения.
Например, чтобы использовать ExoPlayer с поддержкой воспроизведения DASH и компонентами интерфейса, добавьте зависимости от модулей следующим образом:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.11.1")
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
implementation("androidx.media3:media3-ui:1.11.1")
implementation("androidx.media3:media3-ui-compose-material3:1.11.1")
Яркий
implementation "androidx.media3:media3-exoplayer:1.11.1"
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
implementation "androidx.media3:media3-ui:1.11.1"
implementation("androidx.media3:media3-ui-compose-material3:1.11.1")
где 1.11.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, который предоставляет ряд возможностей для настройки. Ниже приведен самый простой пример кода для создания экземпляра.
Kotlin
val player = ExoPlayer.Builder(context).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context).build();
Примечание о цепочках писем
Доступ к экземплярам ExoPlayer должен осуществляться из одного потока приложения. В большинстве случаев это должен быть основной поток приложения. При использовании компонентов интерфейса ExoPlayer или расширения IMA необходимо использовать основной поток приложения.
Поток, в котором должен быть доступен экземпляр ExoPlayer, можно явно указать, передав Looper при создании проигрывателя. Если Looper не указан, используется Looper потока, в котором создан проигрыватель. Если у этого потока нет Looper, используется Looper основного потока приложения. В любом случае Looper потока, из которого нужно получить доступ к проигрывателю, можно запросить с помощью Player.getApplicationLooper.
Подробнее о модели потоков ExoPlayer можно узнать в соответствующем разделе документации ExoPlayer Javadoc.
Как прикрепить проигрыватель к представлению
Библиотека media3-ui содержит ряд готовых компонентов интерфейса для воспроизведения медиаконтента. В частности, в него входит тег PlayerView, который содержит теги PlayerControlView, SubtitleView и Surface, используемые для отрисовки видео. Элемент PlayerView
можно добавить в XML-файл макета приложения. Например, чтобы привязать проигрыватель к представлению:
Kotlin
// Bind the player to the view. playerView.player = player
Java
// Bind the player to the view. playerView.setPlayer(player);
Использовать готовые компоненты интерфейса Media3 необязательно. В видеоприложениях с собственным интерфейсом целевые значения SurfaceView, TextureView, SurfaceHolder или Surface можно задать с помощью методов setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder и setVideoSurface проигрывателя соответственно. Функция обратного вызова Listener.onCues позволяет получать субтитры, которые должны отображаться во время воспроизведения, а функция setImageOutput – декодированные изображения.
Чтобы пользователям было удобнее, добавьте атрибут keepScreenOn. Вы можете изучить другие действия, которые не дают устройству перейти в спящий режим, на страницах фоновых задач.
android:keepScreenOn="true"
Если в вашем приложении для создания интерфейса используется Jetpack Compose, вы можете использовать функцию Player Composable из библиотеки media3-ui-compose-material3. В Player показывается видео и предварительно заполненные значения для слотов элементов управления воспроизведением. Чтобы прикрепить объект androidx.media3.common.Player к объекту androidx.media3.ui.compose.material3.Player Composable, просто передайте его в качестве аргумента:
// Bind the player to the composable. Player(player = player)
Подробнее об использовании компонентов интерфейса Media3 и их настройке можно узнать на странице UI.
Заполнить плейлист и подготовить проигрыватель
В ExoPlayer каждый медиаконтент представлен объектом MediaItem. Чтобы воспроизвести медиаконтент, создайте объект MediaItem, добавьте его в проигрыватель, подготовьте проигрыватель и вызовите метод play, чтобы начать воспроизведение:
Kotlin
// 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()
Java
// 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 поддерживает плейлисты, поэтому можно подготовить проигрыватель с несколькими медиаобъектами, которые будут воспроизводиться один за другим:
Kotlin
// 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()
Java
// 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.