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