בחירת רצועה

כשפריט מדיה מכיל כמה טראקים, בחירת הטראק היא התהליך שקובע אילו מהם ייבחרו להפעלה. תהליך בחירת הטראק הוא שהוגדר על ידי TrackSelectionParameters, שמאפשר מגבלות ושינויים שמשפיעים על בחירת המסלולים שיש לציין.

שליחת שאילתה לטראקים הזמינים

אפשר להאזין ל-Player.Listener.onTracksChanged כדי לקבל התראות על שינויים לטראקים, כולל:

  • הטראקים הזמינים נודעים במהלך ההכנה של פריט המדיה משחקים שהושלמו. הערה: הנגן צריך להכין פריט מדיה כדי לדעת זאת אילו טראקים הוא מכיל.
  • הטראקים הזמינים משתנים בעקבות מעבר בין ההפעלה ממדיה אחת לפריט אחר.
  • שינויים בטראקים שנבחרו.
KotlinJava
player.addListener(
 
object : Player.Listener {
   
override fun onTracksChanged(tracks: Tracks) {
     
// Update UI using current tracks.
   
}
 
}
)
player.addListener(
   
new Player.Listener() {
     
@Override
     
public void onTracksChanged(Tracks tracks) {
       
// Update UI using current tracks.
     
}
   
});

אפשר גם לשלוח שאילתות על הטראקים הנוכחיים באמצעות קריאה ל-player.getCurrentTracks(). ה-Tracks שהוחזר מכיל רשימה של Track.Group אובייקטים, כאשר מסלולים בתוך Group מציגה את אותו תוכן אבל בפורמטים שונים.

כדוגמה לאופן שבו ניתן לקבץ טראקים, כדאי לשקול הפעלה דינמית שבה פיד וידאו ראשי מסופק בחמישה קצבי העברת נתונים, ופיד וידאו חלופי (לדוגמה, זווית מצלמה שונה במשחק ספורט) ניתנת בשני קצבי העברת נתונים. במקרה הזה יהיו שתי קבוצות של טראקים של וידאו, אחת שתואמת לקבוצה הראשית פיד וידאו שכולל חמישה טראקים, ושנייה בפיד הווידאו החלופי שכולל שני טראקים.

טראקים של אודיו שהשפות שלהם שונות לא מקובצות יחד, כי תוכן שפות שונות לא נחשבות כשפות זהות. לעומת זאת, טראקים של אודיו באותה שפה שההבדל היחיד ביניהם הוא מאפיינים, כגון קצב העברת נתונים, דגימה ניתן לקבץ את המספר הזה, את מספר הערוצים וכן הלאה. הכלל הזה חל גם על טראקים של טקסט.

אפשר לשלוח שאילתה לכל Group כדי לקבוע לאילו טראקים יש תמיכה הפעלה, שמסומנת כרגע ואיזה Format משתמש בכל טראק:

KotlinJava
for (trackGroup in tracks.groups) {
 
// Group level information.
 
val trackType = trackGroup.type
 
val trackInGroupIsSelected = trackGroup.isSelected
 
val trackInGroupIsSupported = trackGroup.isSupported
 
for (i in 0 until trackGroup.length) {
   
// Individual track information.
   
val isSupported = trackGroup.isTrackSupported(i)
   
val isSelected = trackGroup.isTrackSelected(i)
   
val trackFormat = trackGroup.getTrackFormat(i)
 
}
}
for (Tracks.Group trackGroup : tracks.getGroups()) {
 
// Group level information.
 
@C.TrackType int trackType = trackGroup.getType();
 
boolean trackInGroupIsSelected = trackGroup.isSelected();
 
boolean trackInGroupIsSupported = trackGroup.isSupported();
 
for (int i = 0; i < trackGroup.length; i++) {
   
// Individual track information.
   
boolean isSupported = trackGroup.isTrackSupported(i);
   
boolean isSelected = trackGroup.isTrackSelected(i);
   
Format trackFormat = trackGroup.getTrackFormat(i);
 
}
}

  • טראק נתמך אם Player יכול לפענח ולעבד את הטראק. דוגמאות. שימו לב שגם אם יש כמה קבוצות מעקב מאותו הסוג (למשל, קבוצות מרובות של טראקים של אודיו) יש תמיכה, נתמכים בנפרד, והנגן לא בהכרח יוכל להפעיל אותם בכל כמעט באותה עת.
  • טראק נבחר אם הוא נבחר להפעלה בהתאם ל TrackSelectionParameters. אם יש כמה טראקים בקבוצת מסלולים אחת שנבחרו, הנגן משתמש בטראקים האלה להפעלה דינמית (לדוגמה, מספר טראקים של וידאו עם קצבי העברת נתונים שונים). חשוב לזכור שרק אחד מהמצבים האלה טראקים יושמעו בכל זמן נתון.

שינוי פרמטרים של בחירת טראק

ניתן להגדיר את תהליך בחירת הטראק באמצעות Player.setTrackSelectionParameters אפשר לעשות את זה לפני וגם במהלך להפעלה. הדוגמה הבאה ממחישה איך לקבל את כתובת ה-URL הנוכחית TrackSelectionParameters מהנגן, שינוי שלהם ועדכון Player עם התוצאה החדשה:

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.setMaxVideoSizeSd()
   
.setPreferredAudioLanguage("hu")
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.setMaxVideoSizeSd()
       
.setPreferredAudioLanguage("hu")
       
.build());

בחירת טראק על סמך מגבלות

רוב האפשרויות ב-TrackSelectionParameters מאפשרות לציין מגבלות, שלא תלויים בטראקים שזמינים בפועל. נמצא/ת המגבלות כוללות:

  • רוחב, גובה, קצב פריימים וקצב העברת נתונים מינימליים ומקסימליים של סרטון.
  • מספר ערוצי אודיו וקצב העברת נתונים מקסימליים.
  • סוגי MIME מועדפים לווידאו ואודיו.
  • שפות אודיו מועדפות וסימונים של תפקידים.
  • שפות טקסט מועדפות ודגלים של תפקידים.

ExoPlayer משתמש בברירות מחדל הגיוניות עבור האילוצים האלה, למשל הגבלה של הסרטון לגודל התצוגה ומעדיפים את שפת האודיו תואם להגדרת הלוקאל של המערכת של המשתמש.

יש כמה יתרונות לשימוש בבחירת טראק שמבוססת על אילוצים במקום בחירת טראקים ספציפיים מתוך הטראקים הזמינים:

  • אפשר להגדיר מגבלות לפני שאתם יודעים איזה מעקב מספק פריט מדיה. כלומר ניתן לציין מגבלות לפני שהנגן הכין פריט מדיה, ואילו בחירת טראקים מסוימים מחייבת קוד אפליקציה מחכים שהטראקים הזמינים יהיו ידועים.
  • המגבלות חלות על כל פריטי המדיה בפלייליסט, גם על לפריטים יש טראקים זמינים שונים. לדוגמה, שפת אודיו מועדפת האילוץ יחול באופן אוטומטי על כל פריטי המדיה, גם אם Format מהטראק בשפה הזו משתנה מפריט מדיה אחד לפריט הבא. זה לא המצב כשבוחרים טראקים ספציפיים, כפי שמתואר בהמשך.

בחירת טראקים ספציפיים

אפשר לבחור טראקים ספציפיים באמצעות TrackSelectionParameters. קודם כל, צריך לחפש את הטראקים שזמינים כרגע בנגן באמצעות Player.getCurrentTracks דבר שני, אחרי שזיהיתי באילו טראקים לבחור, אפשר להגדיר אותם ב-TrackSelectionParameters באמצעות TrackSelectionOverride. לדוגמה, כדי לבחור את הטראק הראשון מתוך audioTrackGroup ספציפי:

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.setOverrideForType(
     
TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
   
)
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.setOverrideForType(
           
new TrackSelectionOverride(
                audioTrackGroup
.getMediaTrackGroup(), /* trackIndex= */ 0))
       
.build());

TrackSelectionOverride יחול רק על פריטי מדיה שמכילים TrackGroup תואם בדיוק לערך שצוין בשינוי מברירת המחדל. לכן ייתכן שהשינוי לא יחול על פריט מדיה נוסף אם הפריט מכיל טראקים שונים.

השבתה של סוגים או קבוצות של טראקים

אפשר להשבית לגמרי סוגי טראקים כמו וידאו, אודיו או טקסט באמצעות TrackSelectionParameters.Builder.setTrackTypeDisabled סוג טראק מושבת יושבת עבור כל פריטי המדיה:

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
       
.build());

לחלופין, אפשר למנוע את הבחירה בטראקים של TrackGroup על ידי ציון שינוי ריק עבור הקבוצה:

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.addOverride(
     
TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
   
)
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.addOverride(
           
new TrackSelectionOverride(
                disabledTrackGroup
.getMediaTrackGroup(),
               
/* trackIndices= */ ImmutableList.of()))
       
.build());

התאמה אישית של בורר הטראקים

בחירת הטראק היא באחריות של TrackSelector, למשל שמתוכם אפשר לספק בכל פעם שExoPlayer נוצר, ולאחר מכן מתקבל עם ExoPlayer.getTrackSelector().

KotlinJava
val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

DefaultTrackSelector הוא TrackSelector גמיש שמתאים לרוב השימוש במקרים שונים. היא משתמשת בהגדרה TrackSelectionParameters בPlayer, אבל גם מספק כמה אפשרויות מתקדמות של התאמה אישית שניתן לציין DefaultTrackSelector.ParametersBuilder:

KotlinJava
trackSelector.setParameters(
  trackSelector
.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)
trackSelector.setParameters(
    trackSelector
.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

מנהור

תוכלו לאפשר הפעלה במנהור במקרים שבהם שילוב של כלי רינדור הטראקים שנבחרו תומכים בכך. כדי לעשות את זה משתמשים DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)

הורדת אודיו

ניתן לאפשר הפעלת אודיו ללא טעינה במקרים שבהם השילוב של כלי הרינדור והטראקים שנבחרו תומכים בכך. כדי לעשות זאת, מציינים AudioOffloadModePreferences ב-TrackSelectionParameters.

KotlinJava
val audioOffloadPreferences =
 
AudioOffloadPreferences.Builder()
     
.setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
     
// Add additional options as needed
     
.setIsGaplessSupportRequired(true)
     
.build()
player
.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.setAudioOffloadPreferences(audioOffloadPreferences)
   
.build()
AudioOffloadPreferences audioOffloadPreferences =
 
new AudioOffloadPreferences.Builder()
     
.setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
     
// Add additional options as needed
     
.setIsGaplessSupportRequired(true)
     
.build();
player
.setTrackSelectionParameters(
  player
.getTrackSelectionParameters()
   
.buildUpon()
   
.setAudioOffloadPreferences(audioOffloadPreferences)
   
.build());
);