画像
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
ExoPlayer は、次の画像形式をサポートしています。異なる形式をサポートする外部ライブラリを統合する方法については、画像読み込みライブラリをご覧ください。
イメージの形式 |
サポート対象 |
備考 |
BMP |
はい |
|
GIF |
いいえ |
エクストラクタのサポートなし |
JPEG |
はい |
|
JPEG モーション写真 |
はい |
静止画像と動画がサポートされている |
JPEG ウルトラ HDR |
はい
|
Android 14 より前または HDR 以外のディスプレイでは SDR にフォールバック |
PNG |
はい |
|
WebP |
はい |
|
HEIF/HEIC |
はい |
|
HEIC モーション フォト |
一部のみ |
静止画像のみサポート* |
AVIF(ベースライン) |
はい |
Android 14 以降でのみデコード |
* HEIC モーション フォトの動画部分は MetadataRetriever で取得し、スタンドアロン ファイルとして再生できます。
再生リストの一部として画像を再生するには、画像の 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
で定義されている場合、モーション フォトは宣言された時間だけ静止画像として表示されます。
- 画像の時間が未定義の場合、モーション フォトは動画として再生されます。
より多くのカスタマイズ オプションを使用するには、MediaItem
ではなく ProgressiveMediaSource
を作成してプレーヤーに直接渡します。
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 つの手順が必要です。
APPLICATION_EXTERNALLY_LOADED_IMAGE
MIME タイプで MediaItem
を定義します。
- 画像読み込みライブラリから
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();
画像読み込みライブラリを使用する画像デコーダ
画像レンダラは、Uri
から Bitmap
を取得するために ExternallyLoadedImageDecoder
が必要です。このデコーダは、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)
)
}
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();
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-07-27 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-07-27 UTC。"],[],[],null,["# Images\n\nExoPlayer supports the following image formats. See\n[Image Loading Libraries](/media/media3/exoplayer/images#image-loading-libraries)\nfor how to integrate with external libraries that may provide support for a\ndifferent set of formats.\n\n| Image format | Supported | Notes |\n|-------------------|-----------|------------------------------------------------------------|\n| BMP | YES | |\n| GIF | NO | No Extractor support |\n| JPEG | YES | |\n| JPEG Motion Photo | YES | Still image and video supported |\n| JPEG Ultra HDR | YES | Falls back to SDR before Android 14 or on non-HDR displays |\n| PNG | YES | |\n| WebP | YES | |\n| HEIF/HEIC | YES | |\n| HEIC Motion Photo | Partially | Only still image supported\\* |\n| AVIF (baseline) | YES | Decoded on Android 14+ only |\n\n\\* The video part of HEIC motion photos can be obtained with\n[MetadataRetriever](/media/media3/exoplayer/retrieving-metadata#motion-photos)\nand played as a standalone file.\n\nUsing MediaItem\n---------------\n\nTo play an image as part of a playlist, create a `MediaItem` with the image URI\nand pass it to the player. The `MediaItem` must have a `imageDurationMs` to\nspecify for how long the image should be displayed. \n\n### Kotlin\n\n```kotlin\n// Create a player instance.\nval player = ExoPlayer.Builder(context).build()\n// Set the media item to be played with the desired duration.\nplayer.setMediaItem(\n MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build())\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\n// Create a player instance.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media item to be played with the desired duration.\nplayer.setMediaItem(\n new MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build());\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\n### Motion Photos\n\nMotion photos are files combining a still image with a short video.\n\n- If the image duration is defined with `setImageDuration`, the motion photo is displayed for the declared duration as a still image.\n- If the image duration is undefined, the motion photo is played as a video.\n\nUsing ProgressiveMediaSource\n----------------------------\n\nFor more customization options, you can create a `ProgressiveMediaSource` and\npass it directly to the player instead of a `MediaItem`. \n\n### Kotlin\n\n```kotlin\n// Create a data source factory.\nval dataSourceFactory = DefaultHttpDataSource.Factory()\n// Create a media item with the image URI and the desired duration.\nval mediaItem =\n MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build()\n// Create a progressive media source for this media item.\nval mediaSource =\n ProgressiveMediaSource.Factory(dataSourceFactory)\n .createMediaSource(mediaItem)\n// Create a player instance.\nval player = ExoPlayer.Builder(context).build()\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource)\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\n// Create a data source factory.\nDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();\n// Create a media item with the image URI and the desired duration.\nMediaItem mediaItem =\n new MediaItem.Builder().setUri(imageUri).setImageDurationMs(2000).build();\n// Create a progressive media source for this media item.\nMediaSource mediaSource =\n new ProgressiveMediaSource.Factory(dataSourceFactory)\n .createMediaSource(mediaItem);\n// Create a player instance.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource);\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\nCustomizing playback\n--------------------\n\nExoPlayer provides multiple ways for you to tailor playback experience to your\napp's needs. See the [Customization page](/guide/topics/media/exoplayer/customization) for examples.\n\nImage Loading Libraries\n-----------------------\n\nImages are often managed by external image loading libraries, for example\n[Glide](https://bumptech.github.io/glide/) or\n[Coil](https://coil-kt.github.io/coil/).\n\nIntegrating these libraries into the playback pipeline requires 3 steps:\n\n1. Define a `MediaItem` with `APPLICATION_EXTERNALLY_LOADED_IMAGE` MIME type.\n2. Provide an image decoder to retrieve a `Bitmap` from the image loading library.\n3. Provide an external loader to trigger caching and preloading.\n\n### MediaItem with externally loaded image MIME type\n\nThe `MediaItem` added to the `Player` must define the\n`APPLICATION_EXTERNALLY_LOADED_IMAGE` MIME type explicitly to use the image\nloading library code paths: \n\n### Kotlin\n\n```kotlin\nval mediaItem =\n MediaItem.Builder()\n .setUri(imageUri)\n .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE)\n .build()\n```\n\n### Java\n\n```java\nMediaItem mediaItem =\n new MediaItem.Builder()\n .setUri(imageUri)\n .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE)\n .build();\n```\n\n\u003cbr /\u003e\n\n### Image decoder using an image loading library\n\nThe image renderer needs an `ExternallyLoadedImageDecoder` to retrieve the\n`Bitmap` from the `Uri`. This decoder can be provided by overriding\n`DefaultRenderersFactory.getImageDecoderFactory`.\n\nThe following example uses Glide to load an image: \n\n### Kotlin\n\n```kotlin\nval glideImageDecoderFactory: ImageDecoder.Factory =\n ExternallyLoadedImageDecoder.Factory { request: ExternalImageRequest -\u003e\n GlideFutures.submit(Glide.with(context).asBitmap().load(request.uri))\n }\nval player: Player =\n ExoPlayer.Builder(context)\n .setRenderersFactory(\n object : DefaultRenderersFactory(context) {\n override fun getImageDecoderFactory(): ImageDecoder.Factory {\n return glideImageDecoderFactory\n }\n }\n )\n .build()\n```\n\n### Java\n\n```java\nImageDecoder.Factory glideImageDecoderFactory =\n new ExternallyLoadedImageDecoder.Factory(\n request -\u003e GlideFutures.submit(\n Glide.with(context).asBitmap().load(request.uri)));\nPlayer player =\n new ExoPlayer.Builder(context)\n .setRenderersFactory(\n new DefaultRenderersFactory(context) {\n @Override\n protected ImageDecoder.Factory getImageDecoderFactory() {\n return glideImageDecoderFactory;\n }\n })\n .build();\n```\n\n\u003cbr /\u003e\n\n### Image preloading with an image loading library\n\nDuring playback, the player requests to preload the next image once the previous\nitem in the playlist has fully loaded. When using an external image loading\nlibrary, you must specify an `ExternalLoader` to trigger this preloading. If no\npreloading is possible or required, this loader still needs to be provided, but\ncan do nothing.\n\nThe following example uses Glide to ensure that the requested image is preloaded\nto disk: \n\n### Kotlin\n\n```kotlin\nval glidePreloader = ExternalLoader { request: LoadRequest -\u003e\n GlideFutures.submit(\n Glide.with(context)\n .asFile()\n .apply(\n RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA)\n .priority(Priority.HIGH)\n .skipMemoryCache(true)\n )\n .load(request.uri)\n )\n}\nval player =\n ExoPlayer.Builder(context)\n .setMediaSourceFactory(DefaultMediaSourceFactory(context)\n .setExternalImageLoader(glidePreloader))\n .build()\n```\n\n### Java\n\n```java\nExternalLoader glidePreloader =\n request -\u003e\n GlideFutures.submit(\n Glide.with(context)\n .asFile()\n .apply(\n diskCacheStrategyOf(DiskCacheStrategy.DATA)\n .priority(Priority.HIGH)\n .skipMemoryCache(true))\n .load(request.uri));\nPlayer player =\n new ExoPlayer.Builder(context)\n .setMediaSourceFactory(new DefaultMediaSourceFactory(context)\n .setExternalImageLoader(glidePreloader))\n .build();\n```\n\n\u003cbr /\u003e"]]