ExoPlayer は、次の画像形式をサポートしています。異なる形式をサポートする外部ライブラリを統合する方法については、画像読み込みライブラリをご覧ください。
イメージの形式 | サポート対象 | 備考 |
---|---|---|
BMP | はい | |
GIF | いいえ | エクストラクタのサポートなし |
JPEG | はい | |
JPEG モーション写真 | はい | 静止画像と動画がサポートされている |
JPEG ウルトラ HDR | はい | Android 14 より前または HDR 以外のディスプレイでは SDR にフォールバック |
PNG | はい | |
WebP | はい | |
HEIF/HEIC | はい | |
HEIC モーション フォト | 一部のみ | 静止画像のみサポート* |
AVIF(ベースライン) | はい | Android 14 以降でのみデコード |
* HEIC モーション フォトの動画部分は MetadataRetriever で取得し、スタンドアロン ファイルとして再生できます。
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 を使用する
より多くのカスタマイズ オプションを使用するには、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) ) }
Java
ExternalLoader glidePreloader = request -> GlideFutures.submit( Glide.with(context) .asFile() .apply( diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true)) .load(request.uri));