ExoPlayer از HLS با چندین فرمت کانتینر پشتیبانی می کند. فرمتهای نمونه صوتی و تصویری موجود نیز باید پشتیبانی شوند (برای جزئیات به بخش قالبهای نمونه مراجعه کنید). ما قویاً تولیدکنندگان محتوای HLS را تشویق میکنیم که جریانهای HLS با کیفیت بالا تولید کنند، همانطور که در اینجا توضیح داده شده است.
ویژگی | پشتیبانی می شود | نظرات |
---|---|---|
ظروف | ||
MPEG-TS | بله | |
FMP4/CMAF | بله | |
ADTS (AAC) | بله | |
MP3 | بله | |
زیرنویسها/زیرنویسهای بسته | ||
CEA-608 | بله | |
CEA-708 | بله | |
WebVTT | بله | |
فراداده | ||
ID3 | بله | |
SCTE-35 | نه | |
حفاظت از محتوا | ||
AES-128 | بله | |
نمونه AES-128 | نه | |
وایدواین | بله | API 19+ (طرح "cenc") و 25+ (طرح "cbcs") |
PlayReady SL2000 | بله | فقط Android TV |
کنترل سرور | ||
به روز رسانی دلتا | بله | |
مسدود کردن بارگیری مجدد لیست پخش | بله | |
مسدود کردن بار نکات پیش بارگذاری | بله | به جز فرگهای فرعی با طول نامشخص |
پخش زنده | ||
پخش زنده منظم | بله | |
HLS کم تاخیر (Apple) | بله | |
HLS با تأخیر کم (انجمن) | نه | |
داده های مشترک رسانه مشتری (CMCD) | بله | راهنمای ادغام |
با استفاده از MediaItem
برای پخش جریان HLS، باید به ماژول HLS وابسته باشید.
کاتلین
implementation("androidx.media3:media3-exoplayer-hls:1.4.1")
شیار
implementation "androidx.media3:media3-exoplayer-hls:1.4.1"
سپس می توانید یک MediaItem
برای URI لیست پخش HLS ایجاد کنید و آن را به پخش کننده ارسال کنید.
کاتلین
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(hlsUri)) // 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(hlsUri)); // Prepare the player. player.prepare();
اگر URI شما به .m3u8
ختم نمیشود، میتوانید MimeTypes.APPLICATION_M3U8
به setMimeType
از MediaItem.Builder
ارسال کنید تا نوع محتوا را به صراحت نشان دهد.
URI آیتم رسانه ممکن است به یک لیست پخش رسانه یا یک لیست پخش چند متغیره اشاره کند. اگر URI به یک لیست پخش چند متغیره اشاره کند که چندین تگ #EXT-X-STREAM-INF
را اعلام می کند، ExoPlayer به طور خودکار بین انواع مختلف با در نظر گرفتن پهنای باند موجود و قابلیت های دستگاه سازگار می شود.
با استفاده از HlsMediaSource
برای گزینههای سفارشیسازی بیشتر، میتوانید یک HlsMediaSource
ایجاد کنید و آن را بهجای MediaItem
مستقیماً به پخشکننده ارسال کنید.
کاتلین
// Create a data source factory. val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a HLS media source pointing to a playlist uri. val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri)) // Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the HLS media source as the playlist with a single media item. player.setMediaSource(hlsMediaSource) // Prepare the player. player.prepare()
جاوا
// Create a data source factory. DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a HLS media source pointing to a playlist uri. HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri)); // Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the HLS media source as the playlist with a single media item. player.setMediaSource(hlsMediaSource); // Prepare the player. player.prepare();
دسترسی به مانیفست
میتوانید با فراخوانی Player.getCurrentManifest
مانیفست فعلی را بازیابی کنید. برای HLS، باید شی برگشتی را به HlsManifest
ارسال کنید. پاسخ تماس onTimelineChanged
Player.Listener
نیز هر زمان که مانیفست بارگیری می شود فراخوانی می شود. این یک بار برای محتوای درخواستی و احتمالاً بارها برای محتوای زنده اتفاق می افتد. قطعه کد زیر نشان می دهد که چگونه یک برنامه می تواند هر زمان که مانیفست بارگیری می شود کاری انجام دهد.
کاتلین
player.addListener( object : Player.Listener { override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) { val manifest = player.currentManifest if (manifest is HlsManifest) { // 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) { HlsManifest hlsManifest = (HlsManifest) manifest; // Do something with the manifest. } } });
سفارشی کردن پخش
ExoPlayer راه های متعددی را برای شما فراهم می کند تا تجربه پخش را مطابق با نیازهای برنامه خود تنظیم کنید. برای نمونه به صفحه سفارشی سازی مراجعه کنید.
غیرفعال کردن آماده سازی بدون تکه
به طور پیش فرض، ExoPlayer از آماده سازی بدون تکه استفاده می کند. این بدان معنی است که ExoPlayer تنها از اطلاعات موجود در لیست پخش چند متغیره برای آماده سازی جریان استفاده می کند، که در صورتی کار می کند که تگ های #EXT-X-STREAM-INF
دارای ویژگی CODECS
باشند.
اگر بخشهای رسانهای شما حاوی آهنگهای زیرنویس مختلطی هستند که با برچسب #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS
در فهرست پخش چند متغیره اعلام نشدهاند، ممکن است لازم باشد این ویژگی را غیرفعال کنید. در غیر این صورت، این آهنگهای زیرنویس شناسایی و پخش نمیشوند. همانطور که در قطعه زیر نشان داده شده است، می توانید آماده سازی بدون تکه را در HlsMediaSource.Factory
غیرفعال کنید. توجه داشته باشید که این امر زمان راهاندازی را افزایش میدهد زیرا ExoPlayer برای کشف این آهنگهای اضافی نیاز به دانلود یک بخش رسانه دارد و ترجیح داده میشود که به جای آن آهنگهای با شرح بسته در فهرست پخش چند متغیره اعلام شود.
کاتلین
val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(false) .createMediaSource(MediaItem.fromUri(hlsUri))
جاوا
HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(false) .createMediaSource(MediaItem.fromUri(hlsUri));
ایجاد محتوای HLS با کیفیت بالا
برای اینکه بیشترین بهره را از ExoPlayer ببرید، دستورالعملهای خاصی وجود دارد که میتوانید برای بهبود محتوای HLS خود دنبال کنید. برای توضیح کامل پست Medium ما را در مورد پخش HLS در ExoPlayer بخوانید. نکات اصلی عبارتند از:
- از مدت زمان دقیق قطعه استفاده کنید.
- از یک جریان رسانه ای مداوم استفاده کنید. اجتناب از تغییرات در ساختار رسانه در سراسر بخش.
- از تگ
#EXT-X-INDEPENDENT-SEGMENTS
استفاده کنید. - به جای فایلهایی که شامل ویدیو و صدا هستند، جریانهای دموکس را ترجیح دهید.
- تمام اطلاعاتی را که می توانید در لیست پخش چند متغیره قرار دهید.
دستورالعمل های زیر به طور خاص برای پخش جریانی زنده اعمال می شود:
- از برچسب
#EXT-X-PROGRAM-DATE-TIME
استفاده کنید. - از تگ
#EXT-X-DISCONTINUITY-SEQUENCE
استفاده کنید. - یک پنجره زنده فراهم کنید. یک دقیقه یا بیشتر عالی است.