يتوافق 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 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.5.0")
رائع
implementation "androidx.media3:media3-exoplayer-dash:1.5.0"
يمكنك بعد ذلك إنشاء 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 طرقًا متعدّدة لتخصيص تجربة التشغيل وفقًا لاحتياجات تطبيقك. اطّلِع على صفحة التخصيص للحصول على أمثلة.