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