כשפריט מדיה מכיל כמה טראקים, בחירת הטראק היא התהליך שקובע אילו מהם ייבחרו להפעלה. תהליך בחירת הטראק מוגדר על ידי 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 מכילה רשימה של אובייקטים מסוג Tracks.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. אפשר לעשות את זה לפני ההפעלה וגם במהלך ההפעלה. בדוגמה הבאה מוצג איך מקבלים את הערכים הנוכחיים של 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());