منابع رسانه ای

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

به طور پیش‌فرض، پخش‌کننده از DefaultMediaSourceFactory استفاده می‌کند که می‌تواند نمونه‌هایی از پیاده‌سازی‌های MediaSource محتوای زیر را ایجاد کند:

DefaultMediaSourceFactory همچنین می‌تواند بسته به ویژگی‌های آیتم‌های رسانه‌ای مربوطه، منابع رسانه‌ای پیچیده‌تری ایجاد کند. این موضوع با جزئیات بیشتر در صفحه آیتم‌های رسانه‌ای توضیح داده شده است.

برای برنامه‌هایی که به تنظیمات منبع رسانه‌ای نیاز دارند که توسط پیکربندی پیش‌فرض پخش‌کننده پشتیبانی نمی‌شوند، گزینه‌های مختلفی برای سفارشی‌سازی وجود دارد.

سفارشی‌سازی ایجاد منبع رسانه

هنگام ساخت پخش‌کننده، می‌توان یک MediaSource.Factory تزریق کرد. برای مثال، اگر یک برنامه بخواهد تبلیغات را درج کند و از CacheDataSource.Factory برای پشتیبانی از ذخیره‌سازی استفاده کند، می‌توان یک نمونه از DefaultMediaSourceFactory را طوری پیکربندی کرد که با این الزامات مطابقت داشته باشد و در حین ساخت پخش‌کننده تزریق شود:

کاتلین

val mediaSourceFactory: MediaSource.Factory =
  DefaultMediaSourceFactory(context)
    .setDataSourceFactory(cacheDataSourceFactory)
    .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

جاوا

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDataSourceFactory(cacheDataSourceFactory)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

فایل JavaDoc DefaultMediaSourceFactory گزینه‌های موجود را با جزئیات بیشتری شرح می‌دهد.

همچنین می‌توان یک پیاده‌سازی سفارشی MediaSource.Factory تزریق کرد، برای مثال برای پشتیبانی از ایجاد یک نوع منبع رسانه سفارشی. createMediaSource(MediaItem) در factory فراخوانی می‌شود تا برای هر آیتم رسانه‌ای که به playlist اضافه می‌شود، یک منبع رسانه ایجاد شود.

API لیست پخش مبتنی بر منبع رسانه

رابط ExoPlayer متدهای لیست پخش اضافی را تعریف می‌کند که منابع رسانه‌ای را به جای آیتم‌های رسانه‌ای می‌پذیرند. این امر امکان دور زدن MediaSource.Factory داخلی پخش‌کننده و ارسال مستقیم نمونه‌های منبع رسانه به پخش‌کننده را فراهم می‌کند:

کاتلین

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()

جاوا

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));

exoPlayer.prepare();
exoPlayer.play();

ترکیب پیشرفته منبع رسانه

ExoPlayer پیاده‌سازی‌های متعدد MediaSource را برای تغییر و ترکیب سایر نمونه‌های MediaSource ارائه می‌دهد. این موارد در مواردی که باید چندین سفارشی‌سازی با هم ترکیب شوند و هیچ یک از مسیرهای راه‌اندازی ساده‌تر کافی نباشند، بیشترین کاربرد را دارند.

  • ClippingMediaSource : امکان برش رسانه در یک محدوده زمانی مشخص را فراهم می‌کند. اگر این تنها تغییر است، بهتر است به جای آن MediaItem.ClippingConfiguration استفاده کنید.
  • FilteringMediaSource : آهنگ‌های موجود را به انواع مشخص‌شده فیلتر می‌کند، برای مثال، فقط آهنگ ویدیویی را از فایلی که شامل صدا و تصویر است، نمایش می‌دهد. اگر این تنها تغییر است، ترجیحاً از پارامترهای انتخاب آهنگ استفاده کنید.
  • MergingMediaSource : چندین منبع رسانه‌ای را برای پخش موازی ادغام می‌کند. تقریباً در همه موارد، توصیه می‌شود سازنده را با adjustPeriodTimeOffsets و clipDurations که روی true تنظیم شده‌اند، فراخوانی کنید تا مطمئن شوید که همه منابع همزمان شروع و پایان می‌یابند. اگر این تغییر برای اضافه کردن زیرنویس‌های جانبی انجام می‌شود، ترجیحاً از MediaItem.SubtitleConfiguration استفاده کنید.
  • ConcatenatingMediaSource2 : چندین منبع رسانه را برای پخش متوالی ادغام می‌کند. ساختار رسانه‌ای قابل مشاهده توسط کاربر، یک Timeline.Window واحد را نمایش می‌دهد، به این معنی که مانند یک آیتم واحد به نظر می‌رسد. اگر این تغییر برای پخش چندین آیتم که قرار نیست مانند یک آیتم واحد به نظر برسند، انجام شود، ترجیحاً از متدهای API لیست پخش مانند Player.addMediaItem استفاده شود.
  • SilenceMediaSource : برای مدت زمان مشخصی سکوت ایجاد می‌کند که برای پر کردن جاهای خالی مفید است.
  • AdsMediaSource : یک منبع رسانه‌ای را با قابلیت‌های درج آگهی در سمت کلاینت گسترش می‌دهد. برای جزئیات بیشتر به راهنمای درج آگهی مراجعه کنید.
  • ServerSideAdInsertionMediaSource : یک منبع رسانه‌ای با قابلیت‌های درج آگهی در سمت سرور را گسترش می‌دهد. برای جزئیات بیشتر به راهنمای درج آگهی مراجعه کنید.