Медиа-материалы

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 .