การเลือกแทร็ก

เมื่อรายการสื่อมีหลายแทร็ก การเลือกแทร็กจะเป็นกระบวนการที่กําหนดว่าระบบจะเลือกแทร็กใดสําหรับเล่น กระบวนการเลือกแทร็กจะกำหนดค่าโดย 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 รายการเดียวจะแสดงเนื้อหาเดียวกันแต่อยู่ในรูปแบบที่แตกต่างกัน

ตัวอย่างการจัดกลุ่มแทร็กคือการเล่นแบบปรับเปลี่ยนได้ซึ่งมีฟีดวิดีโอหลักที่มีอัตราบิต 5 ระดับ และฟีดวิดีโอสำรอง (เช่น มุมกล้องอื่นในการแข่งขันกีฬา) ที่มีอัตราบิต 2 ระดับ ในกรณีนี้จะมีกลุ่มแทร็กวิดีโอ 2 กลุ่ม โดยกลุ่มแรกจะสอดคล้องกับฟีดวิดีโอหลักซึ่งมี 5 แทร็ก และกลุ่มที่ 2 สำหรับฟีดวิดีโอทางเลือกซึ่งมี 2 แทร็ก

ระบบจะไม่จัดกลุ่มแทร็กเสียงที่มีภาษาต่างกัน เนื่องจากเนื้อหาในภาษาต่างๆ ไม่ถือเป็นเนื้อหาเดียวกัน ในทางกลับกัน แทร็กเสียงในภาษาเดียวกันที่ต่างกันเฉพาะในพร็อพเพอร์ตี้ เช่น อัตราบิต อัตราการสุ่มตัวอย่าง จำนวนช่อง และอื่นๆ จะจัดกลุ่มได้ ซึ่งรวมถึงแทร็กข้อความด้วย

คุณสามารถค้นหาแต่ละ 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 ที่แนะนำสำหรับวิดีโอและเสียง
  • ภาษาเสียงที่ต้องการและ Flag บทบาท
  • ภาษาข้อความที่ต้องการและ Flag บทบาท

ExoPlayer ใช้ค่าเริ่มต้นที่เหมาะสมสำหรับข้อจำกัดเหล่านี้ เช่น จำกัดความละเอียดของวิดีโอตามขนาดการแสดงผลและเลือกภาษาของเสียงที่ตรงกับการตั้งค่าภาษาของระบบของผู้ใช้

การใช้การเลือกแทร็กตามข้อจำกัดแทนการเลือกแทร็กที่ต้องการจากแทร็กที่มีให้มีข้อดีหลายประการ ดังนี้

  • คุณสามารถระบุข้อจำกัดได้ก่อนที่จะทราบว่ารายการสื่อมีแทร็กใดบ้าง ซึ่งหมายความว่าคุณระบุข้อจำกัดได้ก่อนที่โปรแกรมเล่นจะเตรียมรายการสื่อ แต่การเลือกแทร็กที่ต้องการจะต้องให้โค้ดแอปพลิเคชันรอจนกว่าจะทราบแทร็กที่ใช้ได้
  • ข้อจำกัดจะมีผลกับรายการสื่อทั้งหมดในเพลย์ลิสต์ แม้ว่ารายการเหล่านั้นจะมีแทร็กที่ใช้ได้แตกต่างกันก็ตาม ตัวอย่างเช่น ข้อจำกัดภาษาของเสียงที่ต้องการจะมีผลกับรายการสื่อทั้งหมดโดยอัตโนมัติ แม้ว่าFormatของแทร็กในภาษานั้นๆ จะแตกต่างกันไปในแต่ละรายการสื่อก็ตาม แต่จะไม่ใช้ในกรณีการเลือกแทร็กที่ต้องการดังที่อธิบายไว้ด้านล่าง

การเลือกแทร็กที่ต้องการ

คุณเลือกแทร็กที่ต้องการได้โดยใช้ TrackSelectionParameters ก่อนอื่น ให้ค้นหาแทร็กที่มีให้ใช้งานในปัจจุบันของโปรแกรมเล่นโดยใช้ Player.getCurrentTracks ประการที่ 2 เมื่อระบุแทร็กที่จะเลือกแล้ว คุณสามารถตั้งค่าแทร็กเหล่านั้นใน 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));

การสร้างอุโมงค์เสมือน

คุณสามารถเปิดใช้การเล่นแบบ Tunnel ในกรณีที่ชุดค่าผสมของโปรแกรมแสดงผลและแทร็กที่เลือกรองรับการเล่นแบบดังกล่าว โดยใช้ 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());
);