Чтобы начать работу с 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 можно найти в разделе Threading model в 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 из библиотеки media3-ui-compose-material3. Player показывает видео и содержит автоматически заполненные значения для слотов элементов управления воспроизведением. Чтобы прикрепить объект androidx.media3.common.Player к composable-функции androidx.media3.ui.compose.material3.Player, просто передайте его в качестве аргумента:
// Bind the player to the composable. Player(player = player)
Подробнее об использовании компонентов интерфейса Media3 и их настройке читайте на странице интерфейса.
Заполнение плейлиста и подготовка проигрывателя
В 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.