تستند playlist API إلى مثيلات MediaItem
التي يمكن إنشاؤها بسهولة
باستخدام MediaItem.Builder
. داخل المشغّل، يتم تحويل MediaItem
إلى MediaSource
قابل للتشغيل من خلال MediaSource.Factory
. بدون
الضبط المخصّص،
يتم تنفيذ هذه الإحالة الناجحة من خلال DefaultMediaSourceFactory
الذي يتيح إنشاء مصادر وسائط معقدة تتوافق مع خصائص
عنصر الوسائط. في ما يلي بعض الخصائص التي يمكن ضبطها على عناصر الوسائط.
عناصر الوسائط البسيطة
يمكنك إنشاء عنصر وسائط يتكون من عنوان URI للبث باستخدام
طريقة ملائمة fromUri
:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
أمّا بالنسبة إلى جميع الحالات الأخرى، فيمكن استخدام MediaItem.Builder
. في المثال التالي، يتم إنشاء عنصر وسائط باستخدام معرّف وبعض البيانات الوصفية المرفقة:
Kotlin
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
قد يكون إرفاق البيانات الوصفية مفيدًا لتحديث واجهة مستخدم التطبيق عند الانتقال إلى قائمة تشغيل.
التعامل مع امتدادات الملفات غير العادية
توفّر ExoPlayer مصادر وسائط تكيُّفية لكل من DASH وHLS وSmoothStreaming. إذا كان معرّف الموارد المنتظم (URI) لعنصر الوسائط التكيّفي هذا ينتهي بامتداد ملف عادي، سيتم إنشاء مصدر الوسائط المقابل تلقائيًا. إذا كان معرّف الموارد المنتظم (URI) يتضمّن إضافة غير عادية أو لا يتضمّن إضافة على الإطلاق، يمكن ضبط نوع MIME بشكل صريح للإشارة إلى نوع عنصر الوسائط:
Kotlin
val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();
بالنسبة إلى مجموعات بث الوسائط التقدّمية، لا يجب استخدام نوع MIME.
المحتوى المحمي
بالنسبة إلى المحتوى المحمي، يجب ضبط خصائص إدارة الحقوق الرقمية لعنصر الوسائط. يكون المعرّف الفريد العالمي (UUID) مطلوبًا، وجميع الخصائص الأخرى اختيارية.
مثال على تهيئة لتشغيل عنصر محمي باستخدام Widevine DRM حيث لا يكون معرِّف الموارد المنتظم (URI) للترخيص متاحًا مباشرةً في الوسائط (على سبيل المثال، في قائمة تشغيل DASH) وهناك حاجة إلى إجراء جلسات متعددة (على سبيل المثال بسبب تدوير المفتاح):
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build()) .build();
وداخل
المشغّل، سيمرر DefaultMediaSourceFactory
هذه الخصائص إلى
DrmSessionManagerProvider
للحصول على DrmSessionManager
، والذي يتم
إدخاله بعد ذلك في MediaSource
الذي تم إنشاؤه. يمكن تخصيص سلوك إدارة الحقوق الرقمية بشكل أكبر
وفقًا لاحتياجاتك.
تحميل مقاطع الترجمة والشرح من مصدر غير معروف
لتحميل مقاطع الترجمة من مصدر غير معروف، يمكن إضافة مثيلات MediaItem.Subtitle
عند إنشاء عنصر وسائط:
Kotlin
val subtitle = SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build() val mediaItem = MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()
Java
MediaItem.SubtitleConfiguration subtitle = new MediaItem.SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build(); MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setSubtitleConfigurations(ImmutableList.of(subtitle)) .build();
داخليًا، سيستخدم DefaultMediaSourceFactory
MergingMediaSource
لدمج مصدر وسائط المحتوى مع SingleSampleMediaSource
لكل
مقطع صوتي فرعي. لا تتيح الدالة DefaultMediaSourceFactory
استخدام الترجمات من مصدر غير معروف
لميزة DASH المتعددة الفترات.
اقتصاص بث وسائط
لاقتصاص المحتوى الذي تمت الإشارة إليه بواسطة عنصر وسائط، يمكنك تعيين مواضع بداية ونهاية مخصصة:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( new ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build()) .build();
داخليًا، سيستخدم DefaultMediaSourceFactory
العلامة ClippingMediaSource
لتجميع
مصدر وسائط المحتوى. هناك خصائص اقتصاص إضافية. راجِع
MediaItem.Builder
Javadoc للحصول على مزيد من التفاصيل.
إدراج إعلان
لإدراج إعلانات، يجب ضبط خاصية معرّف الموارد المنتظم (URI) لعلامة الإعلان الخاصة لعنصر الوسائط:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
داخليًا، ستعمل أداة DefaultMediaSourceFactory
على التفاف مصدر وسائط المحتوى في
AdsMediaSource
لإدراج الإعلانات وفقًا لما هو محدّد في علامة الإعلان. ولكي ينجح هذا الإجراء، يجب أن يتم أيضًا في المشغّل ضبط DefaultMediaSourceFactory
في ما يلي.