Resimler

ExoPlayer aşağıdaki resim biçimlerini destekler. Farklı bir biçim grubu için destek sağlayabilecek harici kitaplıklarla nasıl entegrasyon sağlayacağınızı öğrenmek için Resim Yükleme Kitaplıkları başlıklı makaleyi inceleyin.

Resim biçimi Destekleniyor Notlar
BMP EVET
GIF HAYIR Ayıklayıcı desteği yok
JPEG EVET
JPEG Hareketli Fotoğraf EVET Hareketsiz resim ve video desteklenir.
JPEG Ultra HDR EVET Android 14'ten önceki sürümlerde veya HDR olmayan ekranlarda SDR'ye geri döner.
PNG EVET
WebP EVET
HEIF/HEIC EVET
HEIC Hareketli Fotoğraf Kısmen Yalnızca hareketsiz resim desteklenir*
AVIF (referans) EVET Yalnızca Android 14 ve sonraki sürümlerde kodu çözülür

* HEIC hareketli fotoğrafların video kısmı MetadataRetriever ile elde edilebilir ve bağımsız bir dosya olarak oynatılabilir.

MediaItem'i kullanma

Bir resmi oynatma listesinin parçası olarak oynatmak için resim URI'sini içeren bir MediaItem oluşturun ve oynatıcıya iletin. Resmin ne kadar süreyle gösterileceğini belirtmek için MediaItem öğesinde bir imageDurationMs olmalıdır.

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();

Hareketli Fotoğraflar

Hareketli fotoğraflar, hareketsiz bir resmi kısa bir videoyla birleştiren dosyalardır.

  • Resim süresi setImageDuration ile tanımlanırsa hareketli fotoğraf, belirtilen süre boyunca hareketsiz bir resim olarak gösterilir.
  • Resim süresi tanımlanmamışsa hareketli fotoğraf video olarak oynatılır.

ProgressiveMediaSource'u kullanma

Daha fazla özelleştirme seçeneği için MediaItem yerine ProgressiveMediaSource oluşturup doğrudan oynatıcıya iletebilirsiniz.

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();

Oynatma ayarlarını özelleştirme

ExoPlayer, oynatma deneyimini uygulamanızın ihtiyaçlarına göre özelleştirmenize olanak tanıyan birden fazla yöntem sunar. Örnekler için Özelleştirme sayfasına bakın.

Resim Yükleme Kitaplıkları

Resimler genellikle Glide veya Coil gibi harici resim yükleme kitaplıkları tarafından yönetilir.

Bu kitaplıkların oynatma ardışık düzenine entegrasyonu 3 adımdan oluşur:

  1. APPLICATION_EXTERNALLY_LOADED_IMAGE MIME türüne sahip bir MediaItem tanımlayın.
  2. Resim yükleme kitaplığından Bitmap almak için bir resim kod çözücü sağlayın.
  3. Önbelleğe alma ve ön yüklemeyi tetiklemek için harici bir yükleyici sağlayın.

Harici olarak yüklenen resim MIME türüne sahip MediaItem

Player içine eklenen MediaItem, resim yükleme kitaplığı kod yollarını kullanmak için APPLICATION_EXTERNALLY_LOADED_IMAGE MIME türünü açıkça tanımlamalıdır:

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();

Resim yükleme kitaplığı kullanan resim kod çözücü

Görüntü oluşturma aracının, Uri'den Bitmap'yi almak için bir ExternallyLoadedImageDecoder'ye ihtiyacı vardır. Bu kod çözücü, DefaultRenderersFactory.getImageDecoderFactory geçersiz kılınarak sağlanabilir.

Aşağıdaki örnekte, resim yüklemek için Glide kullanılır:

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();

Resim yükleme kitaplığıyla resim ön yükleme

Oynatma sırasında oynatıcı, oynatma listesinde önceki öğe tamamen yüklendikten sonra bir sonraki resmin önceden yüklenmesini ister. Harici bir resim yükleme kitaplığı kullanırken bu ön yüklemeyi tetiklemek için bir ExternalLoader belirtmeniz gerekir. Ön yükleme yapılamıyorsa veya gerekli değilse bu yükleyicinin yine de sağlanması gerekir ancak hiçbir işlem yapamaz.

Aşağıdaki örnekte, istenen resmin diske önceden yüklenmesini sağlamak için Glide kullanılır:

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));