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

เมื่อรายการสื่อมีแทร็กหลายแทร็ก การเลือกแทร็กคือกระบวนการที่ จะเป็นตัวกำหนดว่าเพลงใดจะถูกเลือกในการเล่น ขั้นตอนการเลือกแทร็ก กำหนดค่าโดย TrackSelectionParameters ซึ่งทำให้ จำกัดและลบล้างการเลือกแทร็กที่มีผลต่อการระบุ

การค้นหาแทร็กที่พร้อมใช้งาน

คุณฟัง Player.Listener.onTracksChanged เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงได้ ในแทร็ก ซึ่งรวมถึง

  • แทร็กที่พร้อมใช้งานซึ่งกลายเป็นที่รู้จักเมื่อเตรียมรายการสื่อ เล่นจนจบ โปรดทราบว่าโปรแกรมเล่นจะต้องเตรียมรายการสื่อเพื่อจะได้ทราบ แทร็กที่มีอยู่
  • แทร็กที่พร้อมใช้งานเปลี่ยนไปเนื่องจากการเปลี่ยนการเล่นจากสื่อหนึ่ง ไปยังอีกรายการ
  • การเปลี่ยนแปลงของแทร็กที่เลือก
KotlinJava
player.addListener(
 
object : Player.Listener {
   
override fun onTracksChanged(tracks: Tracks) {
     
// Update UI using current tracks.
   
}
 
}
)
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 ที่แต่ละแทร็กใช้

KotlinJava
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)
 
}
}
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 ที่มีผลลัพธ์ที่แก้ไขแล้ว:

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.setMaxVideoSizeSd()
   
.setPreferredAudioLanguage("hu")
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.setMaxVideoSizeSd()
       
.setPreferredAudioLanguage("hu")
       
.build());

การเลือกแทร็กตามข้อจำกัด

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

  • ความกว้าง ความสูง อัตราเฟรม และอัตราบิตของวิดีโอสูงสุดและต่ำสุด
  • จำนวนช่องสัญญาณเสียงและอัตราบิตสูงสุด
  • ประเภท MIME ที่ต้องการสำหรับวิดีโอและเสียง
  • ภาษาของเสียงที่ต้องการและการติดธงบทบาท
  • ภาษาข้อความที่ต้องการและการติดธงบทบาท

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

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

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

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

คุณจะเลือกแทร็กที่ต้องการได้โดยใช้ TrackSelectionParameters อันดับแรก คุณควรค้นหาแทร็กที่พร้อมใช้งานในปัจจุบันของผู้เล่นโดยใช้ Player.getCurrentTracks อย่างที่ 2 การระบุว่าจะเลือกแทร็กใด สามารถตั้งค่าใน TrackSelectionParameters โดยใช้ TrackSelectionOverride ตัวอย่างเช่น หากต้องการเลือกแทร็กแรกจาก audioTrackGroup ที่เจาะจง ให้ทำดังนี้

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.setOverrideForType(
     
TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
   
)
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.setOverrideForType(
           
new TrackSelectionOverride(
                audioTrackGroup
.getMediaTrackGroup(), /* trackIndex= */ 0))
       
.build());

TrackSelectionOverride จะมีผลเฉพาะกับรายการสื่อที่มี TrackGroup ตรงกับรายการที่ระบุในการลบล้างทุกประการ ดังนั้น การลบล้างอาจใช้กับรายการสื่อต่อๆ มาไม่ได้หากรายการดังกล่าวมี แทร็กต่างๆ

การปิดใช้ประเภทหรือกลุ่มแทร็ก

คุณสามารถปิดประเภทแทร็ก เช่น วิดีโอ เสียง หรือข้อความ โดยสิ้นเชิงได้โดยใช้ TrackSelectionParameters.Builder.setTrackTypeDisabled ประเภทแทร็กที่ปิดใช้ จะปิดใช้สำหรับรายการสื่อทั้งหมด:

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
       
.build());

หรือป้องกันไม่ให้เลือกแทร็กจาก TrackGroup โดยการระบุการลบล้างที่ว่างเปล่าสำหรับกลุ่มนั้นดังนี้

KotlinJava
player.trackSelectionParameters =
  player
.trackSelectionParameters
   
.buildUpon()
   
.addOverride(
     
TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
   
)
   
.build()
player.setTrackSelectionParameters(
    player
       
.getTrackSelectionParameters()
       
.buildUpon()
       
.addOverride(
           
new TrackSelectionOverride(
                disabledTrackGroup
.getMediaTrackGroup(),
               
/* trackIndices= */ ImmutableList.of()))
       
.build());

การปรับแต่งตัวเลือกแทร็ก

การเลือกแทร็กเป็นความรับผิดชอบของ TrackSelector ซึ่งเป็นอินสแตนซ์ ซึ่งจะจัดเตรียมให้ได้เมื่อมีการสร้าง ExoPlayer และได้มาซึ่ง ด้วย ExoPlayer.getTrackSelector()

KotlinJava
val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

DefaultTrackSelector เป็นTrackSelectorที่มีความยืดหยุ่นซึ่งเหมาะกับการใช้งานส่วนใหญ่ กรณี โดยใช้ชุด TrackSelectionParameters ใน Player แต่ มีตัวเลือกการปรับแต่งขั้นสูงบางส่วนที่สามารถระบุได้ใน DefaultTrackSelector.ParametersBuilder:

KotlinJava
trackSelector.setParameters(
  trackSelector
.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)
trackSelector.setParameters(
    trackSelector
.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

อุโมงค์

คุณเปิดใช้การเล่น Tunnel ได้ในกรณีที่มีการใช้โหมดแสดงภาพร่วมกับ แทร็กที่เลือกรองรับแทร็กนั้น โดยใช้ DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)

การลดเสียง

คุณสามารถเปิดใช้การเล่นเสียงแบบปิดได้ในกรณีที่การใช้ และแทร็กที่เลือกก็รองรับโหมดนี้ โดยการระบุ AudioOffloadModePreferences ใน TrackSelectionParameters

KotlinJava
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()
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());
);