DASH

‫ExoPlayer از DASH با چندین قالب محتوی پشتیبانی می‌کند. جاری‌سازی‌های رسانه باید تفکیک شوند، یعنی ویدیو، صدا، و نوشتار باید در عناصر متمایز AdaptationSet در مانیفست DASH تعریف شوند (CEA-608 استثنا است، همان‌طور که در جدول زیر توضیح داده شده است). قالب‌های نمونه صوتی و ویدیویی موجود نیز باید پشتیبانی شوند (برای جزئیات، به بخش قالب‌های نمونه مراجعه کنید).

ویژگی پشتیبانی می‌شود نظرات
محتوی‌ها
FMP4 بله فقط جاری‌سازی‌های تفکیک‌شده
WebM بله فقط جاری‌سازی‌های تفکیک‌شده
Matroska بله فقط جاری‌سازی‌های تفکیک‌شده
MPEG-TS نه پشتیبانی برنامه‌ریزی نشده است
زیرنویس ناشنوایان / زیرنویس
TTML بله خام یا جاسازی‌شده در FMP4 طبق ISO/IEC 14496-30
WebVTT بله خام یا جاسازی‌شده در FMP4 طبق ISO/IEC 14496-30
CEA-608 بله وقتی بااستفاده از توصیفگرهای دسترس‌پذیری SCTE علامت‌گذاری می‌شود، در FMP4 جاسازی می‌شود
CEA-708 بله وقتی بااستفاده از توصیفگرهای دسترس‌پذیری SCTE علامت‌گذاری می‌شود، در FMP4 جاسازی می‌شود
فراداده
فراداده EMSG بله جاسازی‌شده در FMP4
حفاظت از محتوا
Widevine بله طرح «cenc»: API 19+‎؛ طرح «cbcs»: API 25+‎
PlayReady SL2000 بله ‫Android TV، فقط طرح «cenc»
ClearKey بله میانای برنامه‌سازی کاربردی ۲۱ به‌بالا، فقط طرح «cenc»
درج آگهی
بازپخش چند دوره‌ای بله
جای‌گذاری آگهی با هدایت سرور (پیوندهای متقابل) نه
آگهی‌های سمت سرور و سمت مشتری IMA بله راهنمای درج آگهی
بازپخش زنده
بازپخش زنده معمولی بله
پخش زنده CMAF با تأخیر بسیار کم بله
داده‌های مشترک مشتری رسانه (CMCD) بله راهنمای یکپارچه‌سازی CMCD

درحال استفاده از MediaItem

برای پخش یک جاری‌سازی DASH، باید به واحد DASH وابسته باشید.

کاتلین

implementation("androidx.media3:media3-exoplayer-dash:1.11.1")

شیک

implementation "androidx.media3:media3-exoplayer-dash:1.11.1"

سپس می‌توانید یک MediaItem برای یک نشانی وب DASH MPD ایجاد کنید و آن را به پخش‌کننده منتقل کنید.

کاتلین

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri))
// Prepare the player.
player.prepare()

جاوا

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri));
// Prepare the player.
player.prepare();

اگر شناسه منبع یکنواخت شما با .mpd تمام نمی‌شود، می‌توانید MimeTypes.APPLICATION_MPD را به setMimeType از MediaItem.Builder منتقل کنید تا نوع محتوا را به‌طور صریح مشخص کنید.

‫ExoPlayer به‌طور خودکار بین نمایش‌های تعریف‌شده در مانیفست تطبیق می‌دهد و هم پهنای باند دردسترس و هم قابلیت‌های دستگاه را درنظر می‌گیرد.

استفاده از DashMediaSource

برای گزینه‌های سفارشی‌سازی بیشتر، می‌توانید DashMediaSource ایجاد کنید و آن را به‌جای MediaItem مستقیماً به پخش‌کننده ارسال کنید.

کاتلین

val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a dash media source pointing to a dash manifest uri.
val mediaSource: MediaSource =
  DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))
// Create a player instance which gets an adaptive track selector by default.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

جاوا

DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a dash media source pointing to a dash manifest uri.
MediaSource mediaSource =
    new DashMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(dashUri));
// Create a player instance which gets an adaptive track selector by default.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

دسترسی به مانیفست

می‌توانید مانیفست کنونی را با فراخوانی Player.getCurrentManifest بازیابی کنید. برای DASH باید شیء برگشتی را به DashManifest تبدیل کنید. هرگاه مانیفست بارگیری شود، onTimelineChanged برگشتی Player.Listener نیز فراخوانی می‌شود. این کار یک‌بار برای محتوای درخواستی و احتمالاً چندین بار برای محتوای زنده انجام می‌شود. تکه‌کد زیر نشان می‌دهد که چگونه یک برنامه می‌تواند هر زمان که مانیفست بارگیری می‌شود کاری انجام دهد.

کاتلین

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(
      timeline: Timeline,
      @Player.TimelineChangeReason reason: Int,
    ) {
      val manifest = player.currentManifest
      if (manifest is DashManifest) {
        // Do something with the manifest.
      }
    }
  }
)

جاوا

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          DashManifest dashManifest = (DashManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

سفارشی‌سازی بازپخش

‫ExoPlayer روش‌های متعددی برای سفارشی‌سازی تجربه بازپخش براساس نیازهای برنامه شما ارائه می‌دهد. برای نمونه‌ها، صفحه سفارشی‌سازی را ببینید.