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 بله جاسازی‌شده در FMP4 هنگام علامت‌دهی بااستفاده از توصیف‌کننده‌های «دسترس‌پذیری SCTE»
CEA-708 بله جاسازی‌شده در FMP4 هنگام علامت‌دهی بااستفاده از توصیف‌کننده‌های «دسترس‌پذیری SCTE»
فراداده
فراداده EMSG بله جاسازی‌شده در FMP4
حفاظت از محتوا
Widevine بله طرح «cenc»: میانای برنامه‌سازی کاربردی ۱۹+؛ طرح «cbcs»: میانای برنامه‌سازی کاربردی ۲۵+
PlayReady SL2000 بله Android TV، فقط طرح «cenc»
ClearKey بله میانای برنامه‌سازی کاربردی ۲۱+، فقط طرح «cenc»
درج آگهی
بازپخش چنددوره‌ای بله
درج آگهی با راهنمایی سرور (xlinks) نه
آگهی‌های سمت مشتری و سمت سرور 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 URI ایجاد کنید و آن را به پخش‌کننده ارسال کنید.

کاتلین

// 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 روش‌های متعددی را برای سفارشی‌سازی تجربه بازپخش براساس نیازهای برنامه‌تان ارائه می‌دهد. برای دیدن نمونه‌ها، به صفحه سفارشی‌سازی مراجعه کنید.