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

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

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

คุณสามารถค้นหาแต่ละ 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());