مصادر الوسائط
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
في 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
: توسيع مصدر وسائط باستخدام إعلان من جهة الخادم
إمكانات الإدراج. راجِع دليل إدراج الإعلانات للاطّلاع على التفاصيل.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Media sources\n\nIn ExoPlayer, every piece of media is represented by a `MediaItem`. However\ninternally, the player needs `MediaSource` instances to play the content. The\nplayer creates these from media items using a `MediaSource.Factory`.\n\nBy default the player uses a `DefaultMediaSourceFactory`, which can create\ninstances of the following content `MediaSource` implementations:\n\n- `DashMediaSource` for [DASH](/guide/topics/media/exoplayer/dash).\n- `SsMediaSource` for [SmoothStreaming](/guide/topics/media/exoplayer/smoothstreaming).\n- `HlsMediaSource` for [HLS](/guide/topics/media/exoplayer/hls).\n- `ProgressiveMediaSource` for [regular media files](/guide/topics/media/exoplayer/progressive).\n- `RtspMediaSource` for [RTSP](/guide/topics/media/exoplayer/rtsp).\n\n`DefaultMediaSourceFactory` can also create more complex media sources depending\non the properties of the corresponding media items. This is described in more\ndetail on the\n[Media items page](/guide/topics/media/exoplayer/media-items).\n\nFor apps that need media source setups that are not supported by the\ndefault configuration of the player, there are several options for\ncustomization.\n\nCustomizing media source creation\n---------------------------------\n\nWhen building the player, a `MediaSource.Factory` can be injected. For example,\nif an app wants to insert ads and use a `CacheDataSource.Factory` to support\ncaching, an instance of `DefaultMediaSourceFactory` can be configured to match\nthese requirements and injected during player construction: \n\n### Kotlin\n\n```kotlin\n val mediaSourceFactory: MediaSource.Factory =\n DefaultMediaSourceFactory(context)\n .setDataSourceFactory(cacheDataSourceFactory)\n .setLocalAdInsertionComponents(adsLoaderProvider, playerView)\n val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()\n```\n\n### Java\n\n```java\nMediaSource.Factory mediaSourceFactory =\n new DefaultMediaSourceFactory(context)\n .setDataSourceFactory(cacheDataSourceFactory)\n .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);\nExoPlayer player =\n new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();\n```\n\n\u003cbr /\u003e\n\nThe\n[`DefaultMediaSourceFactory` JavaDoc](/reference/androidx/media3/exoplayer/source/DefaultMediaSourceFactory)\ndescribes the available options in more detail.\n\nIt's also possible to inject a custom `MediaSource.Factory` implementation, for\nexample to support creation of a custom media source type. The factory's\n`createMediaSource(MediaItem)` will be called to create a media source for each\nmedia item that is\n[added to the playlist](/guide/topics/media/exoplayer/playlists).\n\nMedia source based playlist API\n-------------------------------\n\nThe [`ExoPlayer`](/reference/androidx/media3/exoplayer/ExoPlayer) interface defines additional playlist methods that accept\nmedia sources rather than media items. This makes it possible to bypass the\nplayer's internal `MediaSource.Factory` and pass media source instances to the\nplayer directly: \n\n### Kotlin\n\n```kotlin\n// Set a list of media sources as initial playlist.\nexoPlayer.setMediaSources(listOfMediaSources)\n// Add a single media source.\nexoPlayer.addMediaSource(anotherMediaSource)\n\n// Can be combined with the media item API.\nexoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))\n\nexoPlayer.prepare()\nexoPlayer.play()\n```\n\n### Java\n\n```java\n// Set a list of media sources as initial playlist.\nexoPlayer.setMediaSources(listOfMediaSources);\n// Add a single media source.\nexoPlayer.addMediaSource(anotherMediaSource);\n\n// Can be combined with the media item API.\nexoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));\n\nexoPlayer.prepare();\nexoPlayer.play();\n```\n\n\u003cbr /\u003e\n\nAdvanced media source composition\n---------------------------------\n\nExoPlayer provides multiple `MediaSource` implementations to modify and compose\nother `MediaSource` instances. These are most useful in cases where multiple\ncustomizations have to be combined and none of the simpler setup paths are\nsufficient.\n\n- `ClippingMediaSource`: Allows to clip media to a specified timestamp range. If this is the only modification, it's preferable to use [`MediaItem.ClippingConfiguration`](/guide/topics/media/exoplayer/media-items#clipping-media) instead.\n- `FilteringMediaSource`: Filters available tracks to the specified types, for example, just exposing the video track from a file that contains both audio and video. If this is the only modification, it's preferable to use [track selection parameters](/guide/topics/media/exoplayer/track-selection#disabling-track) instead.\n- `MergingMediaSource`: Merges multiple media sources to play in parallel. In almost all cases, it's advisable to call the constructor with `adjustPeriodTimeOffsets` and `clipDurations` set to true to ensure all sources start and end at the same time. If this modification is done to add side-loaded subtitles, it's preferable to use [`MediaItem.SubtitleConfiguration`](/guide/topics/media/exoplayer/media-items#sideloading-subtitle) instead.\n- `ConcatenatingMediaSource2`: Merges multiple media source to play consecutively. The user-visible media structure exposes a single `Timeline.Window`, meaning that it looks like a single item. If this modification is done to play multiple items that are not supposed to look like a single one, it's preferable to use the [playlist API](/guide/topics/media/exoplayer/playlists) methods like `Player.addMediaItem` instead.\n- `SilenceMediaSource`: Generates silence for a specified duration that is useful to fill gaps.\n- `AdsMediaSource`: Extends a media source with client-side ad insertion capabilities. Refer to the [ad insertion guide](/guide/topics/media/exoplayer/ad-insertion) for details.\n- `ServerSideAdInsertionMediaSource`: Extends a media source with server-side ad insertion capabilities. Refer to the [ad insertion guide](/guide/topics/media/exoplayer/ad-insertion) for details."]]