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:
APPLICATION_EXTERNALLY_LOADED_IMAGE
MIME türüne sahip birMediaItem
tanımlayın.- Resim yükleme kitaplığından
Bitmap
almak için bir resim kod çözücü sağlayın. - Ö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));