تصاویر

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

قالب تصویر پشتیبانی شده یادداشت‌ها
بی ام پی بله
گیف خیر پشتیبانی از Extractor ندارد
JPEG بله
عکس متحرک JPEG بله پشتیبانی از تصویر ثابت و ویدئو
JPEG فوق العاده HDR بله به SDR قبل از اندروید ۱۴ یا روی نمایشگرهای غیر HDR برمی‌گردد
پی ان جی بله
وب پی بله
HEIF/HEIC بله
عکس متحرک HEIC تا حدی فقط تصویر ثابت پشتیبانی می‌شود*
AVIF (پایه) بله فقط روی اندروید ۱۴+ رمزگشایی شده است

* بخش ویدیویی عکس‌های متحرک 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 ، مدیریت می‌شوند.

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

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

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

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

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