ExoPlayer 支持以下图片格式。如需了解如何与可能支持另一组格式的外部库集成,请参阅图片加载库。
映像格式 | 支持 | 备注 |
---|---|---|
BMP | 是 | |
GIF | 否 | 不支持提取器 |
JPEG | 是 | |
JPEG 动态照片 | 是 | 支持静态图片和视频 |
JPEG Ultra HDR | 是 | 在 Android 14 之前或在非 HDR 显示屏上回退到 SDR |
PNG | 是 | |
WebP | 是 | |
HEIF/HEIC | 是 | |
HEIC 动态照片 | 部分解决/回答 | 仅支持静态图片* |
AVIF(基准) | 是 | 仅在 Android 14 及更高版本中解码 |
* 您可以使用 MetadataRetriever 获取 HEIC 动态照片的视频部分,并将其作为独立文件播放。
使用 MediaItem
如需在播放列表中播放图片,请使用图片 URI 创建 MediaItem
并将其传递给播放器。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
如需更多自定义选项,您可以创建 ProgressiveMediaSource
并将其直接传递给播放器,而不是 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();
自定义播放
ExoPlayer 提供了多种方法,可让您根据应用的需求量身定制播放体验。如需查看示例,请参阅“自定义”页面。
图片加载库
图片通常由外部图片加载库(例如 Glide 或 Coil)管理。
将这些库集成到播放流水线需要完成 3 个步骤:
- 定义一个
MediaItem
,并为其指定APPLICATION_EXTERNALLY_LOADED_IMAGE
MIME 类型。 - 提供图像解码器,以从图像加载库中检索
Bitmap
。 - 提供外部加载器以触发缓存和预加载。
具有外部加载图片 MIME 类型的 MediaItem
添加到 Player
的 MediaItem
必须明确定义 APPLICATION_EXTERNALLY_LOADED_IMAGE
MIME 类型,才能使用图片加载库代码路径:
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();
使用图像加载库的图像解码器
图片渲染程序需要 ExternallyLoadedImageDecoder
才能从 Uri
检索 Bitmap
。您可以通过替换 DefaultRenderersFactory.getImageDecoderFactory
来提供此解码器。
以下示例使用 Glide 加载图片:
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();
使用图片加载库预加载图片
在播放期间,播放器会在播放列表中的前一项内容完全加载后请求预加载下一张图片。使用外部图片加载库时,您必须指定 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) ) }
Java
ExternalLoader glidePreloader = request -> GlideFutures.submit( Glide.with(context) .asFile() .apply( diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true)) .load(request.uri));