Начало работы

Чтобы начать работу с ExoPlayer, выполните следующие действия:

  1. Добавьте ExoPlayer в качестве зависимости в проект.
  2. Создайте экземпляр ExoPlayer.
  3. Прикрепите проигрыватель к представлению (для вывода видео и ввода данных пользователем).
  4. Подготовьте проигрыватель с помощью MediaItem.
  5. Отпустите кнопку, когда закончите.

Ниже эти шаги описаны подробнее. Полный пример приведен в файле 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.