מקורות מדיה
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
ב-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
: מיזוג של כמה מקורות מדיה כדי להפעיל אותם במקביל. לחשבון
כמעט בכל המקרים, מומלץ לקרוא ל-constructor עם
adjustPeriodTimeOffsets
ו-clipDurations
הוגדרו כ-True כדי לוודא שהכל
מקורות מתחילים ומסתיימים באותו זמן. אם השינוי הזה בוצע כדי להוסיף
כתוביות בטעינה צדדית, עדיף להשתמש בהן
MediaItem.SubtitleConfiguration
במקום זאת.
ConcatenatingMediaSource2
: ממזגים כמה מקורות מדיה כדי להפעיל אותם
ברצף. מבנה המדיה הגלוי למשתמש חושף
Timeline.Window
– נראה כמו פריט אחד. אם
בוצע שינוי כדי להפעיל פריטים מרובים שלא אמורים להיראות
אחת, עדיף להשתמש ב-methods של פלייליסט, כמו
יש גם Player.addMediaItem
.
SilenceMediaSource
: יצירת שקט למשך זמן מוגדר שנמצא
שימושי למילוי פערים.
AdsMediaSource
: הרחבת מקור מדיה באמצעות הוספת מודעות בצד הלקוח
יכולות. פרטים נוספים זמינים במדריך להוספת מודעות.
ServerSideAdInsertionMediaSource
: הרחבת מקור מדיה באמצעות מודעה בצד השרת
יכולות של הוספה. פרטים נוספים זמינים במדריך להוספת מודעות.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","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 (שעון UTC)."],[],[],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."]]