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