Itens de mídia

A API playlist é baseada em instâncias de MediaItem, que podem ser criadas de maneira conveniente usando MediaItem.Builder. Dentro do player, uma MediaItem é convertida em uma MediaSource reproduzível por uma MediaSource.Factory. Sem a configuração personalizada, essa conversão é realizada por um 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 estã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, um MediaItem.Builder pode ser usado. No exemplo a seguir, 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 interface do seu app quando ocorrem transições de playlist.

Lidar com 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 de um item de mídia adaptável terminar com uma extensão de arquivo padrão, a origem 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();

Para fluxos de mídia progressivos, o tipo MIME não é necessário.

Conteúdo protegido

Para conteúdo protegido, as propriedades de DRM do item de mídia devem ser definidas. O UUID é obrigatório, todas as outras propriedades são opcionais.

Um exemplo de configuração para reproduzir um item protegido com o DRM do Widevine em que o URI de licença não está disponível diretamente na mídia (por exemplo, em uma playlist DASH) e várias sessões são necessárias (por exemplo, devido à rotação de chaves):

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

Dentro do player, o DefaultMediaSourceFactory vai transmitir essas propriedades a um DrmSessionManagerProvider para receber um DrmSessionManager, que é injetado no MediaSource criado. O comportamento do DRM pode ser mais personalizado para suas necessidades.

Transferir faixas de legendas por sideload

Para transferir faixas de legenda por sideload, é possível adicionar instâncias de MediaItem.Subtitle 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, o DefaultMediaSourceFactory vai usar um MergingMediaSource para combinar a origem de mídia do conteúdo com um SingleSampleMediaSource para cada faixa de legenda. DefaultMediaSourceFactory não é compatível com legendas por sideload para DASH de vários períodos.

Cortar um stream de mídia

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

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 vai usar um ClippingMediaSource para unir a fonte de mídia do conteúdo. Há outras propriedades de corte. Consulte o MediaItem.BuilderJavadoc 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 deve 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 unir a origem de mídia do conteúdo em um AdsMediaSource para inserir anúncios conforme definido pela tag de anúncio. Para que isso funcione, o jogador também precisa ter o DefaultMediaSourceFactory configurado de acordo.