ExoPlayer תומך ב-DASH עם מספר פורמטים של קונטיינרים. שידורי המדיה חייבים להיות
מפושטת, כלומר הווידאו, האודיו והטקסט חייבים להיות מוגדרים
רכיבי AdaptationSet
במניפסט DASH (CEA-608 הוא חריג כמו
שמתואר בטבלה שבהמשך). הפורמטים הכלולים של דגימות האודיו והווידאו
גם נתמכות (ראו
פורמטים לדוגמה לקבלת פרטים).
תכונה | נתמך | תגובות |
---|---|---|
קונטיינרים | ||
FMP4 | כן | סטרימינג לדוגמה בלבד |
WebM | כן | סטרימינג לדוגמה בלבד |
מטרוסקה | כן | סטרימינג לדוגמה בלבד |
MPEG-TS | לא | לא מתוכננת תמיכה |
כתוביות | ||
TTML | כן | גולמי או מוטמע ב-FMP4 בהתאם לתקן ISO/IEC 14496-30 |
WebVTT | כן | גולמי או מוטמע ב-FMP4 בהתאם לתקן ISO/IEC 14496-30 |
CEA-608 | כן | מוטמע ב-FMP4 עם אותות באמצעות תיאורי נגישות של SCTE |
CEA-708 | כן | מוטמע ב-FMP4 עם אותות באמצעות תיאורי נגישות של SCTE |
מטא נתונים | ||
מטא-נתונים של EGS | כן | מוטמע ב-FMP4 |
הגנה על תוכן | ||
Widevine | כן | 'cenc' scheme: API 19+; 'cbcs' scheme: API 25+ |
PlayReady SL2000 | כן | Android TV , "cenc" סכמה בלבד |
מקש ניקוי | כן | API 21+ , "cenc" סכמה בלבד |
הפעלה בשידור חי | ||
הפעלה רגילה של שידור חי | כן | |
הפעלה בשידור חי של CMAF עם זמן אחזור נמוך במיוחד | כן | |
נתוני לקוח מדיה נפוצים (CMCD) | כן | מדריך ההטמעה |
שימוש ב-MediaItem
כדי להפעיל זרם DASH, יש להסתמך על מודול ה-DASH.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.4.1")
Groovy
implementation "androidx.media3:media3-exoplayer-dash:1.4.1"
לאחר מכן אפשר ליצור MediaItem
עבור DASH MPD URI ולהעביר אותו לנגן.
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 צריך להפעיל Cast של האובייקט שהוחזר אל 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 מספק דרכים רבות להתאמה אישית של חוויית ההפעלה לצרכים של האפליקציה. אפשר לראות דוגמאות בדף ההתאמה האישית.