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) ) }
جاوا
ExternalLoader glidePreloader = request -> GlideFutures.submit( Glide.with(context) .asFile() .apply( diskCacheStrategyOf(DiskCacheStrategy.DATA) .priority(Priority.HIGH) .skipMemoryCache(true)) .load(request.uri));