ExoPlayer از فرمت های تصویر زیر پشتیبانی می کند. برای نحوه ادغام با کتابخانه های خارجی که ممکن است از مجموعه فرمت های متفاوتی پشتیبانی کنند، به کتابخانه های بارگیری تصویر مراجعه کنید.
| فرمت تصویر | پشتیبانی می شود | یادداشت ها |
|---|---|---|
| BMP | بله | |
| GIF | نه | بدون پشتیبانی Extractor |
| JPEG | بله | |
| عکس حرکت JPEG | بله | تصویر ثابت و ویدیو پشتیبانی می شود |
| JPEG Ultra HDR | بله | قبل از Android 14 یا در نمایشگرهای غیر HDR به SDR برمی گردد |
| PNG | بله | |
| وب پی | بله | |
| HEIF/HEIC | بله | |
| عکس حرکت HEIC | تا حدی | فقط تصویر ثابت پشتیبانی می شود* |
| AVIF (خط پایه) | بله | فقط در Android 14+ رمزگشایی شده است |
* بخش ویدیویی عکس های حرکتی HEIC را می توان با MetadataRetriever دریافت کرد و به عنوان یک فایل مستقل پخش کرد.
با استفاده از MediaItem
برای پخش یک تصویر به عنوان بخشی از یک لیست پخش، یک MediaItem با URI تصویر ایجاد کنید و آن را به پخش کننده ارسال کنید. MediaItem باید دارای یک imageDurationMs باشد تا مشخص کند چه مدت تصویر باید نمایش داده شود.
کاتلین
// 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()
جاوا
// 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
برای گزینههای سفارشیسازی بیشتر، میتوانید یک ProgressiveMediaSource ایجاد کنید و آن را بهجای MediaItem مستقیماً به پخشکننده ارسال کنید.
کاتلین
// 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()
جاوا
// 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 مرحله نیاز دارد:
- یک
MediaItemبا نوع MIMEAPPLICATION_EXTERNALLY_LOADED_IMAGEتعریف کنید. - یک رمزگشای تصویر برای بازیابی
Bitmapاز کتابخانه بارگذاری تصویر تهیه کنید. - یک لودر خارجی برای راهاندازی ذخیرهسازی و بارگذاری اولیه ارائه کنید.
MediaItem با نوع MIME تصویر بارگذاری شده خارجی
MediaItem اضافه شده به Player باید نوع MIME APPLICATION_EXTERNALLY_LOADED_IMAGE را به صراحت برای استفاده از مسیرهای کد کتابخانه بارگیری تصویر تعریف کند:
کاتلین
val mediaItem = MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build()
جاوا
MediaItem mediaItem = new MediaItem.Builder() .setUri(imageUri) .setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE) .build();
رمزگشای تصویر با استفاده از کتابخانه بارگذاری تصویر
رندر کننده تصویر به یک ExternallyLoadedImageDecoder برای بازیابی Bitmap از Uri نیاز دارد. این رمزگشا را می توان با لغو DefaultRenderersFactory.getImageDecoderFactory ارائه کرد.
مثال زیر از Glide برای بارگیری یک تصویر استفاده می کند:
کاتلین
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()
جاوا
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 استفاده می کند تا اطمینان حاصل کند که تصویر درخواستی از قبل روی دیسک بارگذاری شده است:
کاتلین
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()
جاوا
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();