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

في 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 على "صحيح" لضمان المصادر وتنتهي في نفس الوقت. إذا تم إجراء هذا التعديل لإضافة ترجمات جانبية، من الأفضل استخدامها MediaItem.SubtitleConfiguration بدلاً من ذلك.
  • ConcatenatingMediaSource2: يدمج مصدر وسائط متعدد لتشغيله على التوالي. تكشف بنية الوسائط المرئية للمستخدم عن محتوى Timeline.Window، ما يعني أنّها تبدو كعنصر واحد. إذا كان هذا يتم فيه إجراء تعديل لتشغيل عناصر متعددة لا يُفترض أن تبدو وكأنها طريقة واحدة، من الأفضل استخدام طرق playlist API مثل Player.addMediaItem بدلاً من ذلك.
  • SilenceMediaSource: تؤدي إلى كتم الصوت لمدة محددة مفيدة لسد الثغرات.
  • AdsMediaSource: توسيع مصدر وسائط من خلال إدراج إعلان من جهة العميل والإمكانات. راجِع دليل إدراج الإعلانات للاطّلاع على التفاصيل.
  • ServerSideAdInsertionMediaSource: توسيع مصدر وسائط باستخدام إعلان من جهة الخادم إمكانات الإدراج. راجِع دليل إدراج الإعلانات للاطّلاع على التفاصيل.