تصاویر

‫ExoPlayer از قالب‌های تصویر زیر پشتیبانی می‌کند. برای نحوه ادغام با کتابخانه‌های خارجی که ممکن است از مجموعه متفاوتی از قالب‌ها پشتیبانی کنند، به کتابخانه‌های بارگذاری تصویر مراجعه کنید.

قالب تصویر پشتیبانی می‌شود یادداشت‌ها
BMP بله
GIF نه «استخراج‌کننده» پشتیبانی نمی‌شود
JPEG بله
عکس حرکتی JPEG بله از تصویر ثابت و ویدیو پشتیبانی می‌شود
‫JPEG وضوح فوق‌العاده بالا بله قبل‌از Android 14 یا در نمایشگرهای غیر HDR به SDR برمی‌گردد
PNG بله
WebP : قالب WebP بله
HEIF/HEIC بله
عکس حرکتی HEIC بله
AVIF (مقدار پایه) بله فقط در Android 14 و نسخه‌های بالاتر رمزگشایی می‌شود

پخش تصاویر در فهرست پخش

برای پخش تصویر به‌عنوان بخشی از فهرست پخش، MediaItem را با نشانی وب تصویر ایجاد کنید و آن را به پخش‌کننده ارسال کنید. 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 ایجاد کنید و به‌جای MediaItem، آن را مستقیماً به پخش‌کننده منتقل کنید.

کاتلین

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

جاوا

// 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، مدیریت می‌شوند.

ادغام این کتابخانه‌ها در خط لوله بازپخش به ۳ مرحله نیاز دارد:

  1. MediaItem با نوع رسانه APPLICATION_EXTERNALLY_LOADED_IMAGE تعریف کنید.
  2. برای بازیابی Bitmap از کتابخانه بار کردن تصویر، رمزگشای تصویر ارائه دهید.
  3. برای راه‌اندازی پیش‌بار کردن و ذخیره کردن در حافظه نهان، بارکننده خارجی ارائه دهید.

پیکربندی کردن فایل‌های رسانه‌ای برای بار کردن خارجی

‫MediaItem اضافه‌شده به Player باید نوع رسانه 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();

رمزگشایی تصاویر بااستفاده از کتابخانه خارجی

پردازنده تصویر برای بازیابی Bitmap از Uri به ExternallyLoadedImageDecoder نیاز دارد. این کدبند را می‌توان با ملغی کردن DefaultRenderersFactory.getImageDecoderFactory ارائه کرد.

مثال زیر از Glide برای بار کردن تصویر استفاده می‌کند و برونداد را به اندازه نمایشگر محدود می‌کند تا از ایجاد اشیای Bitmap بسیار بزرگ جلوگیری کند:

کاتلین

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

جاوا

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 استفاده می‌کند تا مطمئن شود تصویر درخواستی ازقبل در دیسک بارگیری شده است:

کاتلین

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

جاوا

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