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