شَرِطة

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

الميزة معلومات معتمَدة التعليقات
الحاويات
‫FMP4 نعم أحداث البث التي تم فك ترميزها فقط
WebM نعم أحداث البث التي تم فك ترميزها فقط
Matroska نعم أحداث البث التي تم فك ترميزها فقط
‫MPEG-TS لا لا يتوفّر دعم
الترجمة والشرح
TTML نعم تنسيق RAW أو مضمّن في FMP4 وفقًا لمعيار ISO/IEC 14496-30
WebVTT نعم تنسيق RAW أو مضمّن في FMP4 وفقًا لمعيار ISO/IEC 14496-30
‫CEA-608 نعم تكون مضمّنة في FMP4 عند الإشارة إليها باستخدام أوصاف تسهيل الاستخدام في SCTE
‫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();

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