API плейлистов основан на экземплярах MediaItem , которые удобно создавать с помощью MediaItem.Builder . Внутри плеера MediaItem преобразуется в воспроизводимый MediaSource с помощью MediaSource.Factory . Без пользовательской конфигурации это преобразование выполняется DefaultMediaSourceFactory , которая способна создавать сложные источники мультимедиа, соответствующие свойствам элемента мультимедиа. Некоторые из свойств, которые можно установить для элементов мультимедиа, описаны ниже.
Простые медиа-элементы
Медиафайл, состоящий только из URI потока, можно создать с помощью вспомогательного метода fromUri :
Котлин
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
Во всех остальных случаях можно использовать MediaItem.Builder . В следующем примере медиафайл создается с идентификатором и некоторыми прикрепленными метаданными:
Котлин
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
Добавление метаданных может быть полезно для обновления пользовательского интерфейса вашего приложения при переходе между плейлистами.
Изображения
Для воспроизведения изображений необходимо указать продолжительность отображения изображения в медиафайле. Дополнительную информацию о Motion Photos и библиотеках загрузки изображений (например, Glide) см. на странице руководства по изображениям .
Котлин
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-тип можно явно указать, чтобы обозначить тип медиаэлемента:
Котлин
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 обязателен, все остальные свойства необязательны.
Пример конфигурации для воспроизведения контента, защищенного DRM-защитой Widevine, где URI лицензии недоступен непосредственно в медиафайле (например, в плейлисте DASH) и требуется несколько сессий (например, из-за смены ключей):
Котлин
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 при создании медиафайла:
Котлин
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.
Обрезка медиапотока
Чтобы обрезать содержимое, на которое ссылается медиафайл, задайте пользовательские начальную и конечную позиции:
Котлин
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 тега рекламы медиафайла:
Котлин
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 .