تصاویر

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

قالب تصویر پشتیبانی می‌شود یادداشت‌ها
BMP بله
GIF نه بدون پشتیبانی از Extractor
JPEG بله
عکس حرکتی JPEG بله از تصویر ثابت و ویدیو پشتیبانی می‌شود
JPEG Ultra HDR بله در نسخه‌های قبل‌از 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 را با نوع MIME 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();

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

پردازنده تصویر به ExternallyLoadedImageDecoder نیاز دارد تا Bitmap را از Uri بازیابی کند. این رمزگشا را می‌توان با لغو کردن 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();