منابع رسانه ای
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
در ExoPlayer، هر قطعه رسانه با یک MediaItem
نشان داده می شود. با این حال، در داخل، پخش کننده برای پخش محتوا به نمونه های MediaSource
نیاز دارد. پخش کننده این موارد را از آیتم های رسانه ای با استفاده از MediaSource.Factory
ایجاد می کند.
بهطور پیشفرض، پخشکننده از DefaultMediaSourceFactory
استفاده میکند، که میتواند نمونههایی از اجرای MediaSource
محتوای زیر را ایجاد کند:
DefaultMediaSourceFactory
همچنین می تواند منابع رسانه ای پیچیده تری را بسته به ویژگی های آیتم های رسانه مربوطه ایجاد کند. این با جزئیات بیشتر در صفحه آیتم های رسانه توضیح داده شده است.
برای برنامههایی که نیاز به تنظیمات منبع رسانه دارند که توسط پیکربندی پیشفرض پخشکننده پشتیبانی نمیشوند، چندین گزینه برای سفارشیسازی وجود دارد.
هنگام ساختن پخش کننده، می توان MediaSource.Factory
را تزریق کرد. برای مثال، اگر برنامهای بخواهد تبلیغات را درج کند و از CacheDataSource.Factory
برای پشتیبانی از کش استفاده کند، میتوان نمونهای از DefaultMediaSourceFactory
را برای مطابقت با این الزامات پیکربندی کرد و در طول ساخت پخشکننده تزریق کرد:
کاتلین
val mediaSourceFactory: MediaSource.Factory =
DefaultMediaSourceFactory(context)
.setDataSourceFactory(cacheDataSourceFactory)
.setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
جاوا
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
داخلی پخش کننده و ارسال مستقیم نمونه های منبع رسانه به پخش کننده را فراهم می کند:
کاتلین
// 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()
جاوا
// 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
را نشان می دهد، به این معنی که شبیه یک آیتم واحد است. اگر این اصلاح برای پخش چندین آیتم انجام می شود که قرار نیست یک آیتم واحد به نظر برسند، ترجیحاً از روش های API لیست پخش مانند Player.addMediaItem
استفاده کنید. -
SilenceMediaSource
: سکوت را برای مدت زمان مشخصی ایجاد می کند که برای پر کردن شکاف ها مفید است. -
AdsMediaSource
: یک منبع رسانه را با قابلیت درج آگهی در سمت مشتری گسترش می دهد. برای جزئیات بیشتر به راهنمای درج آگهی مراجعه کنید. -
ServerSideAdInsertionMediaSource
: یک منبع رسانه را با قابلیت درج آگهی سمت سرور گسترش می دهد. برای جزئیات بیشتر به راهنمای درج آگهی مراجعه کنید.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","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-29 بهوقت ساعت هماهنگ جهانی."],[],[],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."]]