画像

ExoPlayer は次の画像形式をサポートしています。さまざまな形式をサポートする外部ライブラリとの統合方法については、 画像読み込みライブラリ をご覧ください。

画像形式 サポート対象 メモ
BMP はい
GIF いいえ Extractor はサポートされていません
JPEG はい
JPEG モーション フォト はい 静止画像と動画がサポートされています
JPEG ウルトラ HDR はい Android 14 より前または HDR 以外のディスプレイでは SDR にフォールバックします
PNG はい
WebP はい
HEIF/HEIC はい
HEIC モーション フォト はい
AVIF(ベースライン) はい Android 14 以降でのみデコードされます

再生リスト内の画像を再生する

画像を再生リストの一部として再生するには、画像の 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: 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 には、アプリのニーズに合わせて再生エクスペリエンスを調整する方法が複数用意されています。例については、カスタマイズのページをご覧ください。

外部画像読み込みライブラリを統合する

画像は多くの場合、 GlideCoil などの外部画像読み込みライブラリによって管理されます。

これらのライブラリを再生パイプラインに統合するには、次の 3 つの手順が必要です。

  1. APPLICATION_EXTERNALLY_LOADED_IMAGE MIME タイプで MediaItem を定義します。
  2. 画像読み込みライブラリから Bitmap を取得する画像デコーダを提供します。
  3. キャッシュとプリロードをトリガーする外部ローダーを提供します。

外部読み込み用にメディア アイテムを構成する

画像読み込みライブラリのコードパスを使用するには、Player に追加された MediaItemAPPLICATION_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 を使用して画像を読み込み、出力を表示サイズに制限して、非常に大きな 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();