ExoPlayer поддерживает следующие форматы изображений: Информацию о том, как интегрировать внешние библиотеки, которые могут поддерживать другие форматы, можно найти в разделе Библиотеки для загрузки изображений.
| Формат изображения | Поддерживается | Примечания |
|---|---|---|
| BMP | ДА | |
| GIF | НЕТ | Нет поддержки экстрактора |
| JPEG | ДА | |
| Фото с движением в формате JPEG | ДА | Поддерживаются статичные изображения и видео. |
| JPEG Ultra HDR | ДА | Переход на SDR до Android 14 или на экранах без поддержки HDR |
| PNG | ДА | |
| WebP | ДА | |
| HEIF/HEIC | ДА | |
| Фото с движением в формате HEIC | ДА | |
| AVIF (базовый) | ДА | Декодирование только на устройствах с Android 14 и более поздних версий |
Как воспроизводить изображения в плейлисте
Чтобы воспроизвести изображение в составе плейлиста, создайте объект MediaItem с URI изображения и передайте его проигрывателю. У параметра MediaItem должен быть параметр imageDurationMs, чтобы указать, как долго должно показываться изображение.
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();
Как воспроизводить фото с движением
Фото с движением – это файлы, сочетающие статичное изображение с коротким видео.
- Если продолжительность показа изображения задана с помощью правила
setImageDuration, фото с движением будет показываться как статичное изображение в течение указанного времени. - Если продолжительность не задана, фото с движением воспроизводится как видео.
Как настроить загрузку изображений с помощью источника медиаконтента
Чтобы получить больше возможностей для настройки, создайте ProgressiveMediaSource и передайте его непосредственно проигрывателю вместо MediaItem.
Kotlin
// Create a data source factory. val dataSourceFactory: DataSource.Factory = 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.
Чтобы интегрировать эти библиотеки в конвейер воспроизведения, выполните три шага:
- Определите параметр
MediaItemс MIME-типомAPPLICATION_EXTERNALLY_LOADED_IMAGE. - Предоставьте декодер изображений, чтобы получить
Bitmapиз библиотеки загрузки изображений. - Предоставьте внешний загрузчик для запуска кеширования и предварительной загрузки.
Как настроить медиаобъекты для внешней загрузки
В MediaItem, добавленном в Player, необходимо явно указать MIME-тип APPLICATION_EXTERNALLY_LOADED_IMAGE, чтобы использовать пути кода библиотеки загрузки изображений:
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();
Декодирование изображений с помощью внешней библиотеки
Для получения объекта Bitmap из объекта Uri отрисовщику изображений требуется объект ExternallyLoadedImageDecoder. Этот декодер можно предоставить, переопределив метод
DefaultRenderersFactory.getImageDecoderFactory.
В следующем примере с помощью Glide загружается изображение, размер которого ограничен размером экрана, чтобы не создавать слишком большие объекты Bitmap:
Kotlin
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, чтобы запрошенное изображение было предварительно загружено на диск:
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) ) } val player: 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();