ExoPlayer поддерживает следующие форматы изображений. Инструкции по интеграции с внешними библиотеками, поддерживающими другие форматы, см. в разделе «Библиотеки загрузки изображений».
| Формат изображения | Поддерживается | Примечания |
|---|---|---|
| БМП | ДА | |
| GIF | НЕТ | Нет поддержки экстрактора |
| JPEG | ДА | |
| JPEG Моушн-фото | ДА | Поддерживаются статичные изображения и видео. |
| JPEG Ultra HDR | ДА | В версиях Android до 14 или на дисплеях без поддержки HDR происходит переключение на SDR. |
| ПНГ | ДА | |
| ВебП | ДА | |
| HEIF/HEIC | ДА | |
| HEIC Motion Photo | ДА | |
| AVIF (базовый уровень) | ДА | Расшифровка возможна только на Android 14+ |
Использование MediaItem
Чтобы воспроизвести изображение в составе плейлиста, создайте MediaItem с URI изображения и передайте его плееру. MediaItem должен иметь параметр imageDurationMs , указывающий, как долго должно отображаться изображение.
Котлин
// 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();
Кинофотографии
Видеофотографии — это файлы, сочетающие статичное изображение с коротким видеороликом.
- Если длительность отображения изображения задана параметром
setImageDuration, то движущееся изображение отображается в течение указанного времени как статичное изображение. - Если длительность изображения не задана, движущееся фото воспроизводится как видео.
Использование ProgressiveMediaSource
Для расширения возможностей настройки вы можете создать объект ProgressiveMediaSource и передать его непосредственно плееру вместо MediaItem .
Котлин
// 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();
Настройка воспроизведения
ExoPlayer предоставляет множество способов настроить воспроизведение в соответствии с потребностями вашего приложения. Примеры см. на странице «Настройка» .
Библиотеки загрузки изображений
Обработка изображений часто осуществляется с помощью внешних библиотек для загрузки изображений, например, Glide или Coil .
Для интеграции этих библиотек в конвейер воспроизведения необходимо выполнить 3 шага:
- Определите
MediaItemс MIME-типомAPPLICATION_EXTERNALLY_LOADED_IMAGE. - Предоставьте декодер изображений для получения
Bitmapиз библиотеки загрузки изображений. - Предоставьте внешний загрузчик для запуска кэширования и предварительной загрузки.
Медиаэлемент с MIME-типом изображения, загружаемого извне.
Для использования путей выполнения кода библиотеки загрузки изображений, добавляемый в Player MediaItem должен явно определять MIME-тип APPLICATION_EXTERNALLY_LOADED_IMAGE :
Котлин
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();
Декодер изображений, использующий библиотеку загрузки изображений.
Для получения Bitmap из Uri средству рендеринга изображений необходим объект ExternallyLoadedImageDecoder . Этот декодер можно предоставить, переопределив DefaultRenderersFactory.getImageDecoderFactory .
В следующем примере используется Glide для загрузки изображения, ограничивая вывод размером, соответствующим размеру экрана, чтобы избежать создания очень больших объектов Bitmap :
Котлин
val glideImageDecoderFactory: ImageDecoder.Factory = ExternallyLoadedImageDecoder.Factory { request: ExternalImageRequest -> val displaySize = Util.getCurrentDisplayModeSize(context) GlideFutures.submit( Glide.with(context) .asBitmap() .load(request.uri) .override(max(displaySize.x, displaySize.y))) } val player: Player = ExoPlayer.Builder(context) .setRenderersFactory( object : DefaultRenderersFactory(context) { override fun getImageDecoderFactory(context: Context): ImageDecoder.Factory { return glideImageDecoderFactory } } ) .build()
Java
ImageDecoder.Factory glideImageDecoderFactory = new ExternallyLoadedImageDecoder.Factory( request -> { Point displaySize = Util.getCurrentDisplayModeSize(context); return GlideFutures.submit( Glide.with(context) .asBitmap() .load(request.uri) .override(max(displaySize.x, displaySize.y))); }); Player player = new ExoPlayer.Builder(context) .setRenderersFactory( new DefaultRenderersFactory(context) { @Override protected ImageDecoder.Factory getImageDecoderFactory(Context context) { return glideImageDecoderFactory; } }) .build();
Предварительная загрузка изображений с помощью библиотеки для загрузки изображений.
Во время воспроизведения плеер запрашивает предварительную загрузку следующего изображения после полной загрузки предыдущего элемента в плейлисте. При использовании внешней библиотеки загрузки изображений необходимо указать ExternalLoader для запуска этой предварительной загрузки. Если предварительная загрузка невозможна или не требуется, этот загрузчик все равно необходимо указать, но он не может ничего делать.
В следующем примере используется Glide для обеспечения предварительной загрузки запрошенного образа на диск:
Котлин
val glidePreloader = ExternalLoader { request: LoadRequest -> GlideFutures.submit( Glide.with(context) .asFile() .apply( RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true) ) .load(request.uri) ) } val player = ExoPlayer.Builder(context) .setMediaSourceFactory(DefaultMediaSourceFactory(context) .setExternalImageLoader(glidePreloader)) .build()
Java
ExternalLoader glidePreloader = request -> GlideFutures.submit( Glide.with(context) .asFile() .apply( diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true)) .load(request.uri)); Player player = new ExoPlayer.Builder(context) .setMediaSourceFactory(new DefaultMediaSourceFactory(context) .setExternalImageLoader(glidePreloader)) .build();