خط تیره

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

ویژگی پشتیبانی می شود نظرات
ظروف
FMP4 بله فقط جریان های دموکس
WebM بله فقط جریان های دموکس
ماتروسکا بله فقط جریان های دیموکس
MPEG-TS نه هیچ حمایتی برنامه ریزی نشده است
زیرنویس‌ها/زیرنویس‌های بسته
TTML بله خام، یا تعبیه شده در FMP4 طبق ISO/IEC 14496-30
WebVTT بله خام، یا تعبیه شده در FMP4 طبق ISO/IEC 14496-30
CEA-608 بله هنگامی که با استفاده از توصیفگرهای دسترسی SCTE سیگنال داده می شود، در FMP4 تعبیه شده است
CEA-708 بله هنگامی که با استفاده از توصیفگرهای دسترسی SCTE سیگنال داده می شود، در FMP4 تعبیه شده است
فراداده
فراداده EMSG بله تعبیه شده در FMP4
حفاظت از محتوا
وایدواین بله طرح "cenc": API 19+; طرح "cbcs": API 25+
PlayReady SL2000 بله Android TV، فقط طرح "cenc".
ClearKey بله API 21+، فقط طرح "cenc".
پخش زنده
پخش زنده منظم بله
پخش زنده CMAF با تاخیر بسیار کم بله
داده های مشترک رسانه مشتری (CMCD) بله راهنمای ادغام

با استفاده از MediaItem

برای پخش جریان DASH، باید به ماژول DASH وابسته باشید.

کاتلین

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

شیار

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

سپس می توانید یک 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();

اگر URI شما به .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, @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 راه های متعددی را برای شما فراهم می کند تا تجربه پخش را مطابق با نیازهای برنامه خود تنظیم کنید. برای نمونه به صفحه سفارشی سازی مراجعه کنید.