בחירת רצועה

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