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