HLS

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.0")

شیار

implementation "androidx.media3:media3-exoplayer-hls:1.4.0"

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