เมื่อรายการสื่อมีแทร็กหลายแทร็ก การเลือกแทร็กคือกระบวนการที่
จะเป็นตัวกำหนดว่าเพลงใดจะถูกเลือกในการเล่น ขั้นตอนการเลือกแทร็ก
กำหนดค่าโดย TrackSelectionParameters
ซึ่งทำให้
จำกัดและลบล้างการเลือกแทร็กที่มีผลต่อการระบุ
การค้นหาแทร็กที่พร้อมใช้งาน
คุณฟัง Player.Listener.onTracksChanged
เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงได้
ในแทร็ก ซึ่งรวมถึง
- แทร็กที่พร้อมใช้งานซึ่งกลายเป็นที่รู้จักเมื่อเตรียมรายการสื่อ เล่นจนจบ โปรดทราบว่าโปรแกรมเล่นจะต้องเตรียมรายการสื่อเพื่อจะได้ทราบ แทร็กที่มีอยู่
- แทร็กที่พร้อมใช้งานเปลี่ยนไปเนื่องจากการเปลี่ยนการเล่นจากสื่อหนึ่ง ไปยังอีกรายการ
- การเปลี่ยนแปลงของแทร็กที่เลือก
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
ที่แต่ละแทร็กใช้
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
ที่มีผลลัพธ์ที่แก้ไขแล้ว:
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
ที่เจาะจง ให้ทำดังนี้
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
ประเภทแทร็กที่ปิดใช้
จะปิดใช้สำหรับรายการสื่อทั้งหมด:
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
โดยการระบุการลบล้างที่ว่างเปล่าสำหรับกลุ่มนั้นดังนี้
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()
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
:
trackSelector.setParameters(
trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)
trackSelector.setParameters(
trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
อุโมงค์
คุณเปิดใช้การเล่น Tunnel ได้ในกรณีที่มีการใช้โหมดแสดงภาพร่วมกับ
แทร็กที่เลือกรองรับแทร็กนั้น โดยใช้
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
การลดเสียง
คุณสามารถเปิดใช้การเล่นเสียงแบบปิดได้ในกรณีที่การใช้
และแทร็กที่เลือกก็รองรับโหมดนี้ โดยการระบุ
AudioOffloadModePreferences
ใน TrackSelectionParameters
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());
);