مصادر الوسائط

في ExoPlayer، يتم تمثيل كل جزء من الوسائط باستخدام MediaItem. ومع ذلك، يحتاج المشغّل داخليًا إلى MediaSource مثيل لتشغيل المحتوى. ينشئ المشغّل هذه العناصر من عناصر الوسائط باستخدام MediaSource.Factory.

يستخدم المشغّل تلقائيًا DefaultMediaSourceFactory، ما يتيح إنشاء مثيلات لعمليات تنفيذ MediaSource المحتوى التالية:

يمكن أن تنشئ DefaultMediaSourceFactory أيضًا مصادر وسائط أكثر تعقيدًا استنادًا إلى سمات عناصر الوسائط ذات الصلة. يمكنك الاطّلاع على مزيد من التفاصيل حول ذلك في صفحة عناصر الوسائط.

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

تخصيص عملية إنشاء مصدر الوسائط

عند إنشاء المشغّل، يمكن إدخال MediaSource.Factory. على سبيل المثال، إذا كان أحد التطبيقات يريد إدراج إعلانات واستخدام CacheDataSource.Factory لتفعيل التخزين المؤقت، يمكن ضبط مثيل DefaultMediaSourceFactory ليتوافق مع هذه المتطلبات وإدراجه أثناء إنشاء المشغّل:

Kotlin

val mediaSourceFactory: MediaSource.Factory =
  DefaultMediaSourceFactory(context)
    .setDataSourceFactory(cacheDataSourceFactory)
    .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

Java

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDataSourceFactory(cacheDataSourceFactory)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

توضّح DefaultMediaSourceFactory JavaDoc الخيارات المتاحة بتفصيل أكبر.

يمكن أيضًا إدخال عملية تنفيذ مخصّصة MediaSource.Factory، على سبيل المثال، لدعم إنشاء نوع مصدر وسائط مخصّص. سيتم استدعاء createMediaSource(MediaItem) الخاص بالمصنع لإنشاء مصدر وسائط لكل عنصر وسائط يتم إضافته إلى قائمة التشغيل.

واجهة برمجة تطبيقات لقوائم التشغيل المستندة إلى مصدر الوسائط

تحدّد واجهة ExoPlayer طرقًا إضافية لقوائم التشغيل تقبل مصادر وسائط بدلاً من عناصر الوسائط. يتيح ذلك تجاوز MediaSource.Factory الداخلية الخاصة بالمشغّل وتمرير مثيلات مصدر الوسائط إلى المشغّل مباشرةً:

Kotlin

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()

Java

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));

exoPlayer.prepare();
exoPlayer.play();

تركيب مصدر الوسائط المتقدّم

يوفّر ExoPlayer عمليات تنفيذ متعددة MediaSource لتعديل وإنشاء مثيلات MediaSource أخرى. تكون هذه الطريقة مفيدة جدًا في الحالات التي يجب فيها الجمع بين عدة عمليات تخصيص، ولا تكون أي من طرق الإعداد الأبسط كافية.

  • ClippingMediaSource: تتيح هذه السمة قص الوسائط ضمن نطاق زمني محدّد. إذا كان هذا هو التعديل الوحيد، من الأفضل استخدام MediaItem.ClippingConfiguration بدلاً من ذلك.
  • FilteringMediaSource: لفلترة المقاطع الصوتية والفيديوهات المتاحة حسب الأنواع المحدّدة، على سبيل المثال، لعرض مقطع الفيديو فقط من ملف يحتوي على صوت وفيديو. إذا كان هذا هو التعديل الوحيد، من الأفضل استخدام مَعلمات اختيار المسار بدلاً من ذلك.
  • MergingMediaSource: لدمج مصادر وسائط متعددة لتشغيلها بالتوازي في جميع الحالات تقريبًا، يُنصح باستدعاء الدالة الإنشائية مع ضبط adjustPeriodTimeOffsets وclipDurations على القيمة true لضمان بدء جميع المصادر وانتهائها في الوقت نفسه. إذا تم إجراء هذا التعديل لإضافة مقاطع ترجمة وشرح تم تحميلها بشكل جانبي، من الأفضل استخدام MediaItem.SubtitleConfiguration بدلاً من ذلك.
  • ConcatenatingMediaSource2: لدمج مصادر وسائط متعددة لتشغيلها بشكل متتابع. يكشف هيكل الوسائط المرئي للمستخدم عن Timeline.Window واحد، ما يعني أنّه يبدو كعنصر واحد. إذا تم إجراء هذا التعديل لتشغيل عناصر متعددة لا يُفترض أن تبدو كعنصر واحد، من الأفضل استخدام طرق Playlist API، مثل Player.addMediaItem.
  • SilenceMediaSource: تنشئ هذه السمة صوتًا صامتًا لمدة محددة، وهو أمر مفيد لملء الفجوات.
  • AdsMediaSource: يوسّع مصدر وسائط بإمكانات إدراج الإعلانات من جهة العميل. راجِع دليل إدراج الإعلانات للاطّلاع على التفاصيل.
  • ServerSideAdInsertionMediaSource: يوسّع مصدر وسائط بإمكانات إدراج الإعلانات من جهة الخادم. راجِع دليل إدراج الإعلانات للاطّلاع على التفاصيل.