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

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 .