Itens de mídia

A API da playlist é baseada em instâncias de MediaItem, que podem ser criadas convenientemente usando MediaItem.Builder. Dentro do player, um MediaItem é convertido em um MediaSource jogável por um MediaSource.Factory. Sem a configuração personalizada, essa conversão é realizada por uma DefaultMediaSourceFactory, que é capaz de criar origens de mídia complexas correspondentes às propriedades do item de mídia. Algumas das propriedades que podem ser definidas em itens de mídia são descritas abaixo.

Itens de mídia simples

Um item de mídia que consiste apenas no URI do stream pode ser criado com o método de conveniência fromUri:

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

Para todos os outros casos, uma MediaItem.Builder pode ser usada. No exemplo abaixo, um item de mídia é criado com um ID e alguns metadados anexados:

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();

Anexar metadados pode ser útil para atualizar a IU do seu app quando ocorrem transições de playlist.

Como gerenciar extensões de arquivo não padrão

O ExoPlayer fornece fontes de mídia adaptáveis para DASH, HLS e SmoothStreaming. Se o URI desse item de mídia adaptável terminar com uma extensão de arquivo padrão, a fonte de mídia correspondente será criada automaticamente. Se o URI tiver uma extensão não padrão ou nenhuma extensão, o tipo MIME poderá ser definido explicitamente para indicar o tipo do item de mídia:

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();

Não é necessário ter um tipo MIME para streams de mídia progressivos.

Conteúdo protegido

Para conteúdo protegido, as propriedades DRM do item de mídia precisam ser definidas:

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();

Este exemplo cria um item de mídia para conteúdo protegido do Widevine. No player, o DefaultMediaSourceFactory transmite essas propriedades a um DrmSessionManagerProvider para receber um DrmSessionManager, que é injetado no MediaSource criado. O comportamento do DRM pode ser personalizado para suas necessidades.

Sideload de faixas de legenda

Para transferir faixas de legenda por sideload, instâncias MediaItem.Subtitle podem ser adicionadas ao criar um item de mídia:

Kotlin

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()

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();

Internamente, DefaultMediaSourceFactory usa um MergingMediaSource para combinar a fonte de mídia de conteúdo com um SingleSampleMediaSource para cada faixa de legenda. DefaultMediaSourceFactory não oferece suporte a sideload de legendas para DASH de vários períodos.

Cortar um stream de mídia

Para recortar o conteúdo referido por um item de mídia, defina posições personalizadas de início e fim:

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();

Internamente, DefaultMediaSourceFactory usará um ClippingMediaSource para unir a fonte de mídia de conteúdo. Há propriedades de recorte adicionais. Consulte o Javadoc MediaItem.Builder para mais detalhes.

Inserção de anúncios

Para inserir anúncios, a propriedade URI da tag de anúncio de um item de mídia precisa ser definida:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

Internamente, DefaultMediaSourceFactory vai envolver a origem da mídia de conteúdo em uma AdsMediaSource para inserir anúncios conforme definido pela tag de anúncio. Para que isso funcione, o reprodutor também precisa ter o DefaultMediaSourceFactory configurado corretamente.