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