Playlist API основан на экземплярах MediaItem, которые можно легко создать с помощью MediaItem.Builder. В проигрывателе MediaItem преобразуется в воспроизводимый MediaSource с помощью MediaSource.Factory. Без пользовательской конфигурации это преобразование выполняется с помощью DefaultMediaSourceFactory, который может создавать сложные источники мультимедиа, соответствующие свойствам мультимедийного объекта. Некоторые из свойств, которые можно задать для мультимедийных объектов, описаны в следующих разделах.
Простые мультимедийные объекты
Мультимедийный объект, состоящий только из URI потока, можно создать с помощью удобного метода fromUri:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
Во всех остальных случаях можно использовать MediaItem.Builder. В следующем примере мультимедийный объект создается с идентификатором и прикрепленными метаданными:
Kotlin
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
Прикрепление метаданных может быть полезно для обновления пользовательского интерфейса приложения при переходах между элементами плейлиста.
Изображения
Для воспроизведения изображений требуется указать длительность в объекте мультимедиа, чтобы определить, как долго изображение должно показываться во время воспроизведения. Дополнительную информацию о фото с движением и библиотеках загрузки изображений (например, Glide) можно найти в руководстве Изображения.
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Нестандартные расширения имени файла для адаптивных медиафайлов
ExoPlayer предоставляет адаптивные источники медиаконтента для DASH, HLS и SmoothStreaming. Если URI такого адаптивного мультимедийного объекта заканчивается стандартным расширением имени файла, соответствующий медиаисточник создается автоматически. Если у URI нестандартное расширение или его нет, то MIME-тип можно задать явным образом, чтобы указать тип мультимедийного объекта:
Kotlin
val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();
Для потоков с прогрессивной разверткой MIME-тип не требуется.
Защищенный контент
Для защищенного контента необходимо задать свойства DRM мультимедийного объекта. Обязательным является только свойство UUID.
Пример конфигурации для воспроизведения контента, защищенного Widevine DRM, когда URI лицензии недоступен непосредственно в медиафайле (например, в плейлисте DASH) и требуется несколько сеансов (например, из-за ротации ключей):
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build() ) .build()
Java
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:
Kotlin
val subtitle = 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() val mediaItem = MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()
Java
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 с несколькими периодами.
Вырезание фрагмента из медиапотока
Чтобы обрезать контент, на который ссылается мультимедийный объект, задайте собственные начальную и конечную позиции:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( new ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build()) .build();
Внутри DefaultMediaSourceFactory будет использовать ClippingMediaSource, чтобы упаковать источник медиаконтента. Есть дополнительные свойства обрезки. Подробную информацию можно найти в документации Javadoc по MediaItem.Builder.
Вставка объявлений
Чтобы вставить рекламу, необходимо задать свойство URI тега объявления для мультимедийного объекта:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
Внутренний механизм DefaultMediaSourceFactory упакует источник медиаконтента в AdsMediaSource, чтобы вставить объявления, заданные рекламным тегом. Чтобы это работало, у проигрывателя также должен быть соответствующим образом настроен параметр DefaultMediaSourceFactory.