כשפריט מדיה מכיל כמה טראקים, בחירת הטראק היא התהליך
שקובע אילו מהם ייבחרו להפעלה. תהליך בחירת הטראק הוא
שהוגדר על ידי TrackSelectionParameters
, שמאפשר
מגבלות ושינויים שמשפיעים על בחירת המסלולים שיש לציין.
שליחת שאילתה לטראקים הזמינים
אפשר להאזין ל-Player.Listener.onTracksChanged
כדי לקבל התראות על שינויים
לטראקים, כולל:
- הטראקים הזמינים נודעים במהלך ההכנה של פריט המדיה משחקים שהושלמו. הערה: הנגן צריך להכין פריט מדיה כדי לדעת זאת אילו טראקים הוא מכיל.
- הטראקים הזמינים משתנים בעקבות מעבר בין ההפעלה ממדיה אחת לפריט אחר.
- שינויים בטראקים שנבחרו.
Kotlin
player.addListener( object : Player.Listener { override fun onTracksChanged(tracks: Tracks) { // Update UI using current tracks. } } )
Java
player.addListener( new Player.Listener() { @Override public void onTracksChanged(Tracks tracks) { // Update UI using current tracks. } });
אפשר גם לשלוח שאילתות על הטראקים הנוכחיים באמצעות קריאה ל-player.getCurrentTracks()
.
ה-Tracks
שהוחזר מכיל רשימה של Track.Group
אובייקטים, כאשר מסלולים בתוך
Group
מציגה את אותו תוכן אבל בפורמטים שונים.
כדוגמה לאופן שבו ניתן לקבץ טראקים, כדאי לשקול הפעלה דינמית שבה פיד וידאו ראשי מסופק בחמישה קצבי העברת נתונים, ופיד וידאו חלופי (לדוגמה, זווית מצלמה שונה במשחק ספורט) ניתנת בשני קצבי העברת נתונים. במקרה הזה יהיו שתי קבוצות של טראקים של וידאו, אחת שתואמת לקבוצה הראשית פיד וידאו שכולל חמישה טראקים, ושנייה בפיד הווידאו החלופי שכולל שני טראקים.
טראקים של אודיו שהשפות שלהם שונות לא מקובצות יחד, כי תוכן שפות שונות לא נחשבות כשפות זהות. לעומת זאת, טראקים של אודיו באותה שפה שההבדל היחיד ביניהם הוא מאפיינים, כגון קצב העברת נתונים, דגימה ניתן לקבץ את המספר הזה, את מספר הערוצים וכן הלאה. הכלל הזה חל גם על טראקים של טקסט.
אפשר לשלוח שאילתה לכל Group
כדי לקבוע לאילו טראקים יש תמיכה
הפעלה, שמסומנת כרגע ואיזה Format
משתמש בכל טראק:
Kotlin
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) } }
Java
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
עם התוצאה החדשה:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
בחירת טראק על סמך מגבלות
רוב האפשרויות ב-TrackSelectionParameters
מאפשרות לציין מגבלות,
שלא תלויים בטראקים שזמינים בפועל. נמצא/ת
המגבלות כוללות:
- רוחב, גובה, קצב פריימים וקצב העברת נתונים מינימליים ומקסימליים של סרטון.
- מספר ערוצי אודיו וקצב העברת נתונים מקסימליים.
- סוגי MIME מועדפים לווידאו ואודיו.
- שפות אודיו מועדפות וסימונים של תפקידים.
- שפות טקסט מועדפות ודגלים של תפקידים.
ExoPlayer משתמש בברירות מחדל הגיוניות עבור האילוצים האלה, למשל הגבלה של הסרטון לגודל התצוגה ומעדיפים את שפת האודיו תואם להגדרת הלוקאל של המערכת של המשתמש.
יש כמה יתרונות לשימוש בבחירת טראק שמבוססת על אילוצים במקום בחירת טראקים ספציפיים מתוך הטראקים הזמינים:
- אפשר להגדיר מגבלות לפני שאתם יודעים איזה מעקב מספק פריט מדיה. כלומר ניתן לציין מגבלות לפני שהנגן הכין פריט מדיה, ואילו בחירת טראקים מסוימים מחייבת קוד אפליקציה מחכים שהטראקים הזמינים יהיו ידועים.
- המגבלות חלות על כל פריטי המדיה בפלייליסט, גם על
לפריטים יש טראקים זמינים שונים. לדוגמה, שפת אודיו מועדפת
האילוץ יחול באופן אוטומטי על כל פריטי המדיה, גם אם
Format
מהטראק בשפה הזו משתנה מפריט מדיה אחד לפריט הבא. זה לא המצב כשבוחרים טראקים ספציפיים, כפי שמתואר בהמשך.
בחירת טראקים ספציפיים
אפשר לבחור טראקים ספציפיים באמצעות TrackSelectionParameters
. קודם כל,
צריך לחפש את הטראקים שזמינים כרגע בנגן באמצעות
Player.getCurrentTracks
דבר שני, אחרי שזיהיתי באילו טראקים לבחור,
אפשר להגדיר אותם ב-TrackSelectionParameters
באמצעות TrackSelectionOverride
.
לדוגמה, כדי לבחור את הטראק הראשון מתוך audioTrackGroup
ספציפי:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setOverrideForType( TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0) ) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setOverrideForType( new TrackSelectionOverride( audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0)) .build());
TrackSelectionOverride
יחול רק על פריטי מדיה שמכילים
TrackGroup
תואם בדיוק לערך שצוין בשינוי מברירת המחדל. לכן
ייתכן שהשינוי לא יחול על פריט מדיה נוסף אם הפריט מכיל
טראקים שונים.
השבתה של סוגים או קבוצות של טראקים
אפשר להשבית לגמרי סוגי טראקים כמו וידאו, אודיו או טקסט באמצעות
TrackSelectionParameters.Builder.setTrackTypeDisabled
סוג טראק מושבת
יושבת עבור כל פריטי המדיה:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build());
לחלופין, אפשר למנוע את הבחירה בטראקים של
TrackGroup
על ידי ציון שינוי ריק עבור הקבוצה:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .addOverride( TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf()) ) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .addOverride( new TrackSelectionOverride( disabledTrackGroup.getMediaTrackGroup(), /* trackIndices= */ ImmutableList.of())) .build());
התאמה אישית של בורר הטראקים
בחירת הטראק היא באחריות של TrackSelector
, למשל
שמתוכם אפשר לספק בכל פעם שExoPlayer
נוצר, ולאחר מכן מתקבל
עם ExoPlayer.getTrackSelector()
.
Kotlin
val trackSelector = DefaultTrackSelector(context) val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
DefaultTrackSelector
הוא TrackSelector
גמיש שמתאים לרוב השימוש
במקרים שונים. היא משתמשת בהגדרה TrackSelectionParameters
בPlayer
, אבל גם
מספק כמה אפשרויות מתקדמות של התאמה אישית שניתן לציין
DefaultTrackSelector.ParametersBuilder
:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
מנהור
תוכלו לאפשר הפעלה במנהור במקרים שבהם שילוב של כלי רינדור
הטראקים שנבחרו תומכים בכך. כדי לעשות את זה משתמשים
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
הורדת אודיו
ניתן לאפשר הפעלת אודיו ללא טעינה במקרים שבהם השילוב של
כלי הרינדור והטראקים שנבחרו תומכים בכך. כדי לעשות זאת, מציינים
AudioOffloadModePreferences
ב-TrackSelectionParameters
.
Kotlin
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()
Java
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()); );