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