شَرِطة

يتوافق ExoPlayer مع DASH باستخدام تنسيقات حاويات متعددة. يجب إزالة الترميز من مصادر الوسائط، ما يعني أنّه يجب تحديد الفيديو والصوت والنص في عناصر AdaptationSet مختلفة في بيان DASH (CEA-608 هو استثناء كما هو описан في الجدول أدناه). يجب أيضًا أن تكون تنسيقات عيّنات الصوت والفيديو المضمّنة متوافقة (اطّلِع على القسم تنسيقات العيّنات لمعرفة التفاصيل).

الميزة معلومات معتمَدة التعليقات
الحاويات
FMP4 نعم أحداث البث بعد إزالة فلترها
WebM نعم أحداث البث التي تم فك ترميزها فقط
Matroska نعم أحداث البث التي تم فك ترميزها فقط
‫MPEG-TS لا لا يتوفّر دعم
الترجمة والشرح
TTML نعم غير مضمّن أو مضمّن في FMP4 وفقًا لمعيار ISO/IEC 14496-30
WebVTT نعم تنسيق RAW أو مضمّن في FMP4 وفقًا لمعيار ISO/IEC 14496-30
معيار CEA-608 نعم تكون مضمّنة في FMP4 عند إرسال إشارة باستخدام أوصاف SCTE Accessibility
‫CEA-708 نعم تكون مضمّنة في FMP4 عند إرسال إشارة باستخدام أوصاف SCTE Accessibility
البيانات الوصفية
البيانات الوصفية لتنسيق EMSG نعم مضمّنة في FMP4
حماية المحتوى
Widevine نعم مخطط "cenc": واجهة برمجة التطبيقات 19+، مخطط "cbcs": واجهة برمجة التطبيقات 25+
‫PlayReady SL2000 نعم Android TV، مخطّط "cenc" فقط
ClearKey نعم الإصدار 21 من واجهة برمجة التطبيقات والإصدارات الأحدث، مخطّط "cenc" فقط
تشغيل مباشر
تشغيل مباشر عادي نعم
تشغيل المحتوى المباشر بتنسيق CMAF بوقت استجابة فائق السرعة نعم
بيانات العميل المشترك في الوسائط (CMCD) نعم دليل الدمج

استخدام MediaItem

لتشغيل بث DASH، عليك الاعتماد على وحدة DASH.

Kotlin

implementation("androidx.media3:media3-exoplayer-dash:1.4.1")

رائع

implementation "androidx.media3:media3-exoplayer-dash:1.4.1"

يمكنك بعد ذلك إنشاء MediaItem لعنوان URL الخاص بملف DASH MPD ونقله إلى مشغّل الوسائط.

Kotlin

// 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()

Java

// 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.

Kotlin

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()

Java

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 كلما تم تحميل البيان. سيحدث ذلك مرة واحدة للمحتوى المسجّل، وقد يتم تكراره عدة مرات للمحتوى المباشر. يوضِّح المقتطف التالي من الرمز البرمجي كيف يمكن للتطبيق تنفيذ إجراء معيّن عند تحميل البيان.

Kotlin

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.
      }
    }
  }
)

Java

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 العديد من الطرق لتخصيص تجربة التشغيل وفقًا لاحتياجات تطبيقك. راجِع صفحة التخصيص للحصول على أمثلة.