A API playlist é baseada em instâncias de MediaItem
, que podem ser criadas de maneira conveniente
usando MediaItem.Builder
. Dentro do player, um MediaItem
é convertido em
uma MediaSource
reproduzível por um MediaSource.Factory
. Sem
configuração personalizada,
essa conversão é realizada por um DefaultMediaSourceFactory
, que é
capazes de criar fontes de mídia complexas correspondentes às propriedades
item de mídia. Algumas das propriedades que podem ser definidas em itens de mídia estão descritas
a seguir.
Itens de mídia simples
Um item de mídia que consiste apenas no URI do stream pode ser criado com o fromUri
.
método de conveniência:
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,
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 Como atualizar a interface do seu app quando ocorrem transições de playlist.
Imagens
A reprodução de imagens exige uma duração no item de mídia para especificar por quanto tempo a imagem deve ser exibida durante a reprodução. Consulte a página do guia Imagens para mais informações sobre Fotos com movimento e Bibliotecas de carregamento de imagens (por exemplo, Glide).
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Extensões de arquivo não padrão para mídia adaptável
O ExoPlayer oferece fontes de mídia adaptáveis para DASH, HLS e SmoothStreaming Se o URI desse item de mídia adaptável terminar com um 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();
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 demais são opcionais.
Um exemplo de configuração para reproduzir um item protegido com DRM Widevine em que o o URI da licença não estiver 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
transmitirá essas propriedades a um
DrmSessionManagerProvider
para conseguir um DrmSessionManager
, que é
injetada no MediaSource
criado. O comportamento do DRM pode ser
ainda mais personalizados
de acordo com suas necessidades.
Transferir faixas de legendas por sideload
Para transferir faixas de legendas por sideload, adicione instâncias de MediaItem.Subtitle
ao
criação de 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 oferece suporte a sideload
legendas para vários períodos DASH.
Cortar um stream de mídia
Para recortar o conteúdo referido por um item de mídia, defina um posições inicial e final:
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, o DefaultMediaSourceFactory
vai usar um ClippingMediaSource
para unir
a fonte de mídia do conteúdo. Há outras propriedades de corte. Consulte a
MediaItem.Builder
Javadoc 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, o DefaultMediaSourceFactory
agrupará a fonte de mídia do conteúdo em uma
AdsMediaSource
para inserir anúncios conforme definido pela tag de anúncio. Para que isso funcione, o
o jogador também precisa ter a DefaultMediaSourceFactory
configurados de acordo.