API списков воспроизведения основан на экземплярах MediaItem
, которые можно удобно создать с помощью MediaItem.Builder
. Внутри проигрывателя MediaItem
преобразуется в воспроизводимый MediaSource
с помощью MediaSource.Factory
. Без пользовательской конфигурации это преобразование выполняется с помощью DefaultMediaSourceFactory
, который способен создавать сложные медиа-источники, соответствующие свойствам медиа-элемента. Некоторые свойства, которые можно установить для элементов мультимедиа, описаны ниже.
Простые медиа-элементы
Медиа-элемент, состоящий только из URI потока, можно создать с помощью удобного метода fromUri
:
Котлин
val mediaItem = MediaItem.fromUri(videoUri)
Ява
MediaItem mediaItem = MediaItem.fromUri(videoUri);
Во всех остальных случаях можно использовать MediaItem.Builder
. В следующем примере элемент мультимедиа создается с идентификатором и некоторыми прикрепленными метаданными:
Котлин
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
Ява
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
Прикрепление метаданных может быть полезно для обновления пользовательского интерфейса вашего приложения при возникновении переходов в плейлистах.
Изображения
Для воспроизведения изображений требуется указать длительность в элементе мультимедиа, чтобы указать, как долго изображение должно отображаться во время воспроизведения. Дополнительную информацию о анимированных фотографиях и библиотеках загрузки изображений (например, Glide) см. на странице руководства по изображениям .
Котлин
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Ява
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Нестандартные расширения файлов для адаптивных медиа
ExoPlayer предоставляет адаптивные медиа-источники для DASH, HLS и SmoothStreaming. Если URI такого адаптивного медиа-элемента заканчивается стандартным расширением файла, соответствующий медиа-источник создается автоматически. Если URI имеет нестандартное расширение или вообще не имеет расширения, то тип MIME можно установить явно, чтобы указать тип элемента мультимедиа:
Котлин
val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()
Ява
MediaItem mediaItem = new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();
Для прогрессивных медиапотоков тип MIME не требуется.
Защищенный контент
Для защищенного контента необходимо установить свойства DRM элемента мультимедиа. UUID является обязательным, все остальные свойства являются необязательными.
Пример конфигурации для воспроизведения элемента, защищенного с помощью Widevine DRM, где URI лицензии недоступен непосредственно на носителе (например, в списке воспроизведения DASH) и требуется несколько сеансов (например, из-за ротации ключей):
Котлин
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build() ) .build()
Ява
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build()) .build();
Внутри проигрывателя DefaultMediaSourceFactory
передаст эти свойства DrmSessionManagerProvider
для получения DrmSessionManager
, который затем вводится в созданный MediaSource
. Поведение DRM можно дополнительно настроить в соответствии с вашими потребностями.
Загрузка неопубликованных дорожек субтитров
Чтобы загрузить дорожки субтитров, экземпляры MediaItem.Subtitle
можно добавить при создании медиа-элемента:
Котлин
val subtitle = SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build() val mediaItem = MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()
Ява
MediaItem.SubtitleConfiguration subtitle = new MediaItem.SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build(); MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setSubtitleConfigurations(ImmutableList.of(subtitle)) .build();
Внутри DefaultMediaSourceFactory
будет использовать MergingMediaSource
для объединения источника мультимедиа контента с SingleSampleMediaSource
для каждой дорожки субтитров. DefaultMediaSourceFactory
не поддерживает загрузку неопубликованных субтитров для DASH с несколькими периодами.
Обрезка медиапотока
Чтобы вырезать контент, на который ссылается элемент мультимедиа, установите собственные начальную и конечную позиции:
Котлин
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build() ) .build()
Ява
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( new ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build()) .build();
Внутри DefaultMediaSourceFactory
будет использовать ClippingMediaSource
для переноса источника мультимедиа контента. Имеются дополнительные свойства обрезки. Дополнительные сведения см. MediaItem.Builder
Javadoc .
Вставка объявления
Чтобы вставить рекламу, необходимо установить свойство URI рекламного тега элемента мультимедиа:
Котлин
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
Ява
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
Внутренне DefaultMediaSourceFactory
обертывает источник мультимедиа контента в AdsMediaSource
для вставки рекламы, как определено тегом объявления. Чтобы это работало, проигрывателю также необходимо соответствующим образом настроить DefaultMediaSourceFactory
.