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

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

สำหรับตัวอย่างวิธีจัดกลุ่มแทร็ก ลองพิจารณาการเล่นแบบปรับอัตโนมัติซึ่ง ฟีดวิดีโอหลักจะให้บริการใน 5 อัตราบิต และฟีดวิดีโอทางเลือก (เช่น มุมกล้องที่แตกต่างกันในการแข่งกีฬา) จะมีการระบุเป็น 2 อัตราบิต ในกรณีนี้จะมีกลุ่มแทร็กวิดีโอ 2 กลุ่ม กลุ่มหนึ่งสอดคล้องกับ ฟีดวิดีโอที่มี 5 แทร็ก และฟีดวิดีโอทางเลือกเป็นฟีดวิดีโอทางเลือก ที่ประกอบด้วย 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 หากหลายแทร็กภายในกลุ่มแทร็ก 1 กลุ่ม โปรแกรมเล่นวิดีโอจะใช้แทร็กเหล่านี้ในการเล่นแบบปรับอัตโนมัติ (เช่น แทร็กวิดีโอหลายแทร็กที่มีอัตราบิตต่างกัน) โปรดทราบว่าหนึ่งในเกณฑ์ต่อไปนี้ จะเล่นเมื่อใดก็ได้

การแก้ไขพารามิเตอร์การเลือกแทร็ก

กระบวนการเลือกแทร็กสามารถกำหนดค่าได้โดยใช้ 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 ของแทร็กในภาษานั้นจะแตกต่างกันไปจากรายการสื่อ 1 รายการไปยังรายการถัดไป ซึ่งจะไม่เป็นเช่นนั้นเมื่อเลือกแทร็กใดแทร็กหนึ่งเท่านั้น ดังที่ได้อธิบายไว้ด้านล่าง

การเลือกแทร็กที่เฉพาะเจาะจง

คุณจะเลือกแทร็กที่ต้องการได้โดยใช้ 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());
);