מקף

ExoPlayer תומך ב-DASH עם מספר פורמטים של קונטיינרים. שידורי המדיה חייבים להיות demuxed, כלומר הווידאו, האודיו והטקסט חייבים להיות מוגדרים בנפרד רכיבי 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.0")

מגניב

implementation "androidx.media3:media3-exoplayer-dash:1.4.0"

לאחר מכן אפשר ליצור 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 מספק דרכים רבות להתאמה אישית של חוויית ההפעלה לצרכים של האפליקציה. אפשר לראות דוגמאות בדף ההתאמה האישית.