O ExoPlayer é compatível com os seguintes formatos de imagem. Consulte Bibliotecas de carregamento de imagens para saber como fazer a integração com bibliotecas externas que podem oferecer suporte a um conjunto diferente de formatos.
Formato da imagem | Compatível | Observações |
---|---|---|
BMP | SIM | |
GIF | NÃO | Sem suporte ao Extractor |
JPEG | SIM | |
Foto em movimento JPEG | SIM | Suporte a imagem estática e vídeo |
JPEG Ultra HDR | SIM | Volta para SDR antes do Android 14 ou em telas não HDR |
PNG | SIM | |
WebP | SIM | |
HEIF/HEIC | SIM | |
Foto com movimento HEIC | Parcialmente | Somente imagens estáticas são aceitas* |
AVIF (linha de base) | SIM | Decodificado apenas no Android 14 e em versões mais recentes |
* A parte de vídeo das fotos em movimento HEIC pode ser obtida com MetadataRetriever e reproduzida como um arquivo independente.
Como usar o MediaItem
Para reproduzir uma imagem como parte de uma playlist, crie uma MediaItem
com o URI da imagem
e transmita para o player. O MediaItem
precisa ter um imageDurationMs
para
especificar por quanto tempo a imagem deve ser exibida.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played with the desired duration. player.setMediaItem( MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build()) // Prepare the player. player.prepare()
Java
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played with the desired duration. player.setMediaItem( new MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build()); // Prepare the player. player.prepare();
Fotos com movimento
As fotos com movimento são arquivos que combinam uma imagem estática com um vídeo curto.
- Se a duração da imagem for definida com
setImageDuration
, a foto com movimento será exibida como uma imagem estática durante a duração declarada. - Se a duração da imagem for indefinida, a foto com movimento será reproduzida como um vídeo.
Como usar o ProgressiveMediaSource
Para mais opções de personalização, crie uma ProgressiveMediaSource
e
transmita-a diretamente para o player em vez de uma MediaItem
.
Kotlin
// Create a data source factory. val dataSourceFactory = DefaultHttpDataSource.Factory() // Create a media item with the image URI and the desired duration. val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build() // Create a progressive media source for this media item. val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem) // Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
Java
// Create a data source factory. DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a media item with the image URI and the desired duration. MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build(); // Create a progressive media source for this media item. MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem); // Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
Como personalizar a reprodução
O ExoPlayer oferece várias maneiras de personalizar a experiência de reprodução de acordo com as necessidades do app. Consulte a página de personalização para conferir exemplos.
Bibliotecas de carregamento de imagens
As imagens geralmente são gerenciadas por bibliotecas externas de carregamento de imagens, por exemplo, Glide ou Coil.
A integração dessas bibliotecas ao pipeline de reprodução exige três etapas:
- Defina um
MediaItem
com o tipo MIMEAPPLICATION_EXTERNALLY_LOADED_IMAGE
. - Forneça um decodificador de imagem para recuperar um
Bitmap
da biblioteca de carregamento de imagens. - Forneça um carregador externo para acionar o armazenamento em cache e o pré-carregamento.
MediaItem com tipo MIME de imagem carregada externamente
O MediaItem
adicionado ao Player
precisa definir o
tipo MIME APPLICATION_EXTERNALLY_LOADED_IMAGE
explicitamente para usar os caminhos
de código da biblioteca de carregamento de imagens:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build();
Decodificador de imagem usando uma biblioteca de carregamento de imagens
O renderizador de imagens precisa de um ExternallyLoadedImageDecoder
para extrair o
Bitmap
do Uri
. Esse decodificador pode ser fornecido substituindo
DefaultRenderersFactory.getImageDecoderFactory
.
O exemplo a seguir usa o Glide para carregar uma imagem:
Kotlin
val glideImageDecoderFactory: ImageDecoder.Factory = ExternallyLoadedImageDecoder.Factory { request: ExternalImageRequest -> GlideFutures.submit(Glide.with(context).asBitmap().load(request.uri)) } val player: Player = ExoPlayer.Builder(context) .setRenderersFactory( object : DefaultRenderersFactory(context) { override fun getImageDecoderFactory(): ImageDecoder.Factory { return glideImageDecoderFactory } } ) .build()
Java
ImageDecoder.Factory glideImageDecoderFactory = new ExternallyLoadedImageDecoder.Factory( request -> GlideFutures.submit( Glide.with(context).asBitmap().load(request.uri))); Player player = new ExoPlayer.Builder(context) .setRenderersFactory( new DefaultRenderersFactory(context) { @Override protected ImageDecoder.Factory getImageDecoderFactory() { return glideImageDecoderFactory; } }) .build();
Pré-carregamento de imagens com uma biblioteca de carregamento de imagens
Durante a reprodução, o player solicita o pré-carregamento da próxima imagem assim que o item
anterior da playlist é totalmente carregado. Ao usar uma biblioteca de carregamento de imagens
externa, especifique um ExternalLoader
para acionar esse pré-carregamento. Se nenhum
pré-carregamento for possível ou necessário, esse carregador ainda precisará ser fornecido, mas
não poderá fazer nada.
O exemplo a seguir usa o Glide para garantir que a imagem solicitada seja pré-carregada no disco:
Kotlin
val glidePreloader = ExternalLoader { request: LoadRequest -> GlideFutures.submit( Glide.with(context) .asFile() .apply( RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true) ) .load(request.uri) ) }
Java
ExternalLoader glidePreloader = request -> GlideFutures.submit( Glide.with(context) .asFile() .apply( diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true)) .load(request.uri));