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 |
שימוש ב-MediaItem
כדי להפעיל סטרימינג ב-DASH, צריך להסתמך על מודול DASH.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.7.1")
מגניב
implementation "androidx.media3:media3-exoplayer-dash:1.7.1"
לאחר מכן אפשר ליצור 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
כדי לקבל אפשרויות נוספות להתאמה אישית, אפשר ליצור 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 מספק מספר דרכים להתאמת חוויית ההפעלה לצרכים של האפליקציה. דוגמאות מופיעות בדף ההתאמה האישית.