عناصر الوسائط

تستند واجهة برمجة التطبيقات لقوائم التشغيل إلى 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();

يمكن أن يكون إرفاق البيانات الوصفية مفيدًا في تعديل واجهة المستخدم في تطبيقك عند حدوث انتقالات في قائمة التشغيل.

صور

يتطلّب تشغيل الصور تحديد مدة في عنصر الوسائط لتحديد المدة التي يجب أن تظهر فيها الصورة أثناء التشغيل. يمكنك الاطّلاع على صفحة دليل الصور للحصول على مزيد من المعلومات حول الصور المتحركة ومكتبات تحميل الصور (مثل Glide).

Kotlin

val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).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 حيث لا يتوفّر معرّف الموارد المنتظم للترخيص مباشرةً في الوسائط (مثلاً في قائمة تشغيل 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 الذي تم إنشاؤه. يمكن تخصيص سلوك إدارة الحقوق الرقمية (DRM) بشكل أكبر ليناسب احتياجاتك.

تثبيت مسارات الترجمة من مصدر غير معروف

لتحميل مسارات الترجمة والشرح بشكل جانبي، يمكن إضافة مثيلات MediaItem.Subtitle عند إنشاء عنصر وسائط:

Kotlin

val subtitle =
  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()
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 تثبيت ترجمة وشرح بشكل جانبي لبرنامج البث الديناميكي التكيُّفي عبر HTTP ‏(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())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

داخليًا، ستغلّف DefaultMediaSourceFactory مصدر وسائط المحتوى بعلامة AdsMediaSource لإدراج الإعلانات على النحو المحدّد في علامة الإعلان. ولكي ينجح ذلك، يجب أن يكون DefaultMediaSourceFactory اللاعب قد تم إعداده بشكل صحيح.