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.10.0")
گرووی
implementation "androidx.media3:media3-exoplayer-dash:1.10.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();
دسترسی به مانیفست
You can retrieve the current manifest by calling Player.getCurrentManifest . For DASH you should cast the returned object to DashManifest . The onTimelineChanged callback of Player.Listener is also called whenever the manifest is loaded. This will happen once for a on-demand content, and possibly many times for live content. The following code snippet shows how an app can do something whenever the manifest is loaded.
کاتلین
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 روشهای مختلفی را برای شما فراهم میکند تا تجربه پخش را با نیازهای برنامه خود تطبیق دهید. برای مثالها به صفحه شخصیسازی مراجعه کنید.