מקף
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
ExoPlayer תומך ב-DASH עם מספר פורמטים של קונטיינרים. צריך לבצע דה-מולטיפלקס לזרמי המדיה, כלומר צריך להגדיר את הווידאו, האודיו והטקסט ברכיבי AdaptationSet
נפרדים במניפסט DASH (יש יוצא מן הכלל לגבי CEA-608, כפי שמתואר בטבלה שלמטה). פורמטים של דגימות אודיו ווידאו שכלולים בקובץ צריכים להיות נתמכים גם כן (פרטים מופיעים בקטע פורמטים של דגימות).
תכונה |
נתמך |
תגובות |
קונטיינרים |
|
|
FMP4 |
כן |
רק סטרימינג של קובצי demux |
WebM |
כן |
רק סטרימינג של קובצי demux |
Matroska |
כן |
רק סטרימינג של קובצי demux |
MPEG-TS |
לא |
לא מתוכננת תמיכה |
כתוביות |
|
|
TTML
|
כן
|
גולמי, או מוטמע ב-FMP4
בהתאם לתקן ISO/IEC 14496-30 |
WebVTT
|
כן
|
גולמי, או מוטמע ב-FMP4
בהתאם לתקן ISO/IEC 14496-30 |
CEA-608
|
כן
|
מוטמע ב-FMP4 כשמסמנים אותו באמצעות תיאורי נגישות של SCTE |
CEA-708
|
כן
|
מוטמע ב-FMP4 כשמסמנים אותו באמצעות תיאורי נגישות של SCTE |
מטא-נתונים |
|
|
מטא-נתונים של EMSG |
כן |
מוטמע ב-FMP4 |
הגנה על תוכן |
|
|
Widevine
|
כן
|
'cenc': API 19+;
'cbcs': API 25+ |
PlayReady SL2000 |
כן |
Android TV, סכמת cenc בלבד |
ClearKey |
כן |
API 21 ומעלה, סכימת 'cenc' בלבד |
הצגת מודעות |
|
|
הפעלה של תוכן עם כמה תקופות |
כן |
|
הוספת מודעות בהנחיית השרת
(xlinks) |
לא
|
|
מודעות בצד השרת ובצד הלקוח של IMA |
כן
|
מדריך להוספת מודעות
|
הפעלה בשידור חי |
|
|
הפעלה רגילה של שידור חי |
כן |
|
הפעלה של שידורים חיים בפורמט CMAF עם זמן אחזור קצר במיוחד |
כן
|
|
Common Media Client Data
(CMCD) |
כן
|
מדריך להטמעה של CMCD
|
כדי להפעיל סטרימינג ב-DASH, צריך להסתמך על מודול DASH.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.8.0")
גרוב
implementation "androidx.media3:media3-exoplayer-dash:1.8.0"
לאחר מכן אפשר ליצור MediaItem
עבור URI של DASH MPD ולהעביר אותו לנגן.
Kotlin
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri))
// Prepare the player.
player.prepare()
Java
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri));
// Prepare the player.
player.prepare();
אם ה-URI לא מסתיים ב-.mpd
, אפשר להעביר את MimeTypes.APPLICATION_MPD
אל setMimeType
של MediaItem.Builder
כדי לציין במפורש את סוג התוכן.
ExoPlayer יבצע התאמה אוטומטית בין הייצוגים שמוגדרים במניפסט, תוך התחשבות ברוחב הפס הזמין וביכולות המכשיר.
כדי לקבל אפשרויות נוספות להתאמה אישית, אפשר ליצור DashMediaSource
ולהעביר אותו ישירות לנגן במקום MediaItem
.
Kotlin
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a dash media source pointing to a dash manifest uri.
val mediaSource: MediaSource =
DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))
// Create a player instance which gets an adaptive track selector by default.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()
Java
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a dash media source pointing to a dash manifest uri.
MediaSource mediaSource =
new DashMediaSource.Factory(dataSourceFactory)
.createMediaSource(MediaItem.fromUri(dashUri));
// Create a player instance which gets an adaptive track selector by default.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();
גישה למניפסט
כדי לאחזר את קובץ המניפסט הנוכחי, אפשר לקרוא ל-Player.getCurrentManifest
.
ב-DASH, צריך להעביר את האובייקט שמוחזר אל DashManifest
. המערכת קוראת גם לפונקציית הקריאה החוזרת onTimelineChanged
של Player.Listener
בכל פעם שהמניפסט נטען. הפעולה הזו תתבצע פעם אחת לתוכן על פי דרישה, ויכול להיות שהיא תתבצע הרבה פעמים לתוכן בשידור חי. בקטע הקוד הבא מוצג איך אפליקציה יכולה לבצע פעולה כלשהי בכל פעם שקובץ המניפסט נטען.
Kotlin
player.addListener(
object : Player.Listener {
override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
val manifest = player.currentManifest
if (manifest is DashManifest) {
// Do something with the manifest.
}
}
}
)
Java
player.addListener(
new Player.Listener() {
@Override
public void onTimelineChanged(
Timeline timeline, @Player.TimelineChangeReason int reason) {
Object manifest = player.getCurrentManifest();
if (manifest != null) {
DashManifest dashManifest = (DashManifest) manifest;
// Do something with the manifest.
}
}
});
התאמה אישית של ההפעלה
ExoPlayer מספק מספר דרכים להתאמת חוויית ההפעלה לצרכים של האפליקציה. דוגמאות מופיעות בדף ההתאמה האישית.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-08-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-08-27 (שעון UTC)."],[],[],null,["# DASH\n\nExoPlayer supports DASH with multiple container formats. Media streams must be\ndemuxed, meaning that video, audio, and text must be defined in distinct\n`AdaptationSet` elements in the DASH manifest (CEA-608 is an exception as\ndescribed in the table below). The contained audio and video sample formats must\nalso be supported (see the\n[sample formats](/media/media3/exoplayer/supported-formats#sample-formats) section for details).\n\n| Feature | Supported | Comments |\n|-----------------------------------------|-----------|----------------------------------------------------------------------|\n| **Containers** | | |\n| FMP4 | YES | Demuxed streams only |\n| WebM | YES | Demuxed streams only |\n| Matroska | YES | Demuxed streams only |\n| MPEG-TS | NO | No support planned |\n| **Closed captions /** **subtitles** | | |\n| TTML | YES | Raw, or embedded in FMP4 according to ISO/IEC 14496-30 |\n| WebVTT | YES | Raw, or embedded in FMP4 according to ISO/IEC 14496-30 |\n| CEA-608 | YES | Embedded in FMP4 when signalled using SCTE Accessibility descriptors |\n| CEA-708 | YES | Embedded in FMP4 when signalled using SCTE Accessibility descriptors |\n| **Metadata** | | |\n| EMSG metadata | YES | Embedded in FMP4 |\n| **Content protection** | | |\n| Widevine | YES | \"cenc\" scheme: API 19+; \"cbcs\" scheme: API 25+ |\n| PlayReady SL2000 | YES | Android TV, \"cenc\" scheme only |\n| ClearKey | YES | API 21+, \"cenc\" scheme only |\n| **Ad insertion** | | |\n| Multi-period playback | YES | |\n| Server-guided ad insertion (xlinks) | NO | |\n| IMA server-side and client-side ads | YES | [Ad insertion guide](/media/media3/exoplayer/ad-insertion) |\n| **Live playback** | | |\n| Regular live playback | YES | |\n| Ultra low-latency CMAF live playback | YES | |\n| **Common Media Client Data** **(CMCD)** | YES | [CMCD integration guide](/media/media3/exoplayer/cmcd) |\n\nUsing MediaItem\n---------------\n\nTo play a DASH stream, you need to depend on the DASH module. \n\n### Kotlin\n\n```kotlin\nimplementation(\"androidx.media3:media3-exoplayer-dash:1.8.0\")\n```\n\n### Groovy\n\n```groovy\nimplementation \"androidx.media3:media3-exoplayer-dash:1.8.0\"\n```\n\nYou can then create a `MediaItem` for a DASH MPD URI and pass it to the player. \n\n### Kotlin\n\n```kotlin\n// Create a player instance.\nval player = ExoPlayer.Builder(context).build()\n// Set the media item to be played.\nplayer.setMediaItem(MediaItem.fromUri(dashUri))\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\n// Create a player instance.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media item to be played.\nplayer.setMediaItem(MediaItem.fromUri(dashUri));\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\nIf your URI doesn't end with `.mpd`, you can pass `MimeTypes.APPLICATION_MPD`\nto `setMimeType` of `MediaItem.Builder` to explicitly indicate the type of the\ncontent.\n\nExoPlayer will automatically adapt between representations defined in the\nmanifest, taking into account both available bandwidth and device capabilities.\n\nUsing DashMediaSource\n---------------------\n\nFor more customization options, you can create a `DashMediaSource` and pass it\ndirectly to the player instead of a `MediaItem`. \n\n### Kotlin\n\n```kotlin\nval dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()\n// Create a dash media source pointing to a dash manifest uri.\nval mediaSource: MediaSource =\n DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))\n// Create a player instance which gets an adaptive track selector by default.\nval player = ExoPlayer.Builder(context).build()\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource)\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\nDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();\n// Create a dash media source pointing to a dash manifest uri.\nMediaSource mediaSource =\n new DashMediaSource.Factory(dataSourceFactory)\n .createMediaSource(MediaItem.fromUri(dashUri));\n// Create a player instance which gets an adaptive track selector by default.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource);\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\nAccessing the manifest\n----------------------\n\nYou can retrieve the current manifest by calling `Player.getCurrentManifest`.\nFor DASH you should cast the returned object to `DashManifest`. The\n`onTimelineChanged` callback of `Player.Listener` is also called whenever\nthe manifest is loaded. This will happen once for a on-demand content, and\npossibly many times for live content. The following code snippet shows how an app\ncan do something whenever the manifest is loaded. \n\n### Kotlin\n\n```kotlin\nplayer.addListener(\n object : Player.Listener {\n override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {\n val manifest = player.currentManifest\n if (manifest is DashManifest) {\n // Do something with the manifest.\n }\n }\n }\n)\n```\n\n### Java\n\n```java\nplayer.addListener(\n new Player.Listener() {\n @Override\n public void onTimelineChanged(\n Timeline timeline, @Player.TimelineChangeReason int reason) {\n Object manifest = player.getCurrentManifest();\n if (manifest != null) {\n DashManifest dashManifest = (DashManifest) manifest;\n // Do something with the manifest.\n }\n }\n });\n```\n\n\u003cbr /\u003e\n\nCustomizing playback\n--------------------\n\nExoPlayer provides multiple ways for you to tailor playback experience to your\napp's needs. See the [Customization page](/guide/topics/media/exoplayer/customization) for examples."]]