خط تیره

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

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

استفاده از MediaItem

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

کاتلین

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

گرووی

implementation "androidx.media3:media3-exoplayer-dash:1.8.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 روش‌های مختلفی را برای شما فراهم می‌کند تا تجربه پخش را با نیازهای برنامه خود تطبیق دهید. برای مثال‌ها به صفحه شخصی‌سازی مراجعه کنید.