หน้านี้จะอธิบายวิธีสร้าง DefaultPreloadManager
ซึ่งจะโหลดเนื้อหาสื่อล่วงหน้าสำหรับแอปตามกลยุทธ์ที่คุณเลือก
เครื่องมือจัดการการโหลดล่วงหน้าตามคลาสBasePreloadManager
Abstract ช่วยให้คุณ
จัดอันดับเนื้อหาตามเกณฑ์ที่คุณเลือกได้ เอกสารนี้อธิบายวิธีใช้คลาสที่ได้มา DefaultPreloadManager
ซึ่งแต่ละรายการสื่อจะได้รับการจัดอันดับด้วย
จำนวนเต็มที่แสดงตำแหน่งในรายการ (เช่น ตำแหน่งใน
วิดีโอแคร์เซล) ตัวจัดการการโหลดล่วงหน้าจะจัดลําดับความสําคัญของการโหลดรายการตามระยะทาง
ที่อยู่ใกล้กับรายการที่ผู้ใช้กําลังเล่น ด้วยวิธีนี้ หากผู้ใช้เปลี่ยนไปดูรายการอื่น รายการใหม่จะเริ่มเล่นได้ทันที
การสร้างอินสแตนซ์ของ DefaultPreloadManager
มี 3 ขั้นตอนดังนี้
- กำหนด
TargetPreloadStatusControl
ที่ตัวจัดการการโหลดล่วงหน้าสามารถ ค้นหาเพื่อดูว่ารายการสื่อพร้อมโหลดหรือไม่และควรโหลด เท่าใด - สร้างเครื่องมือสร้างที่คุณจะใช้เพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้า และ
เพื่อสร้างออบเจ็กต์
ExoPlayer
ของแอป - ใช้เครื่องมือสร้างเพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้าโดยเรียกใช้เมธอด
build()
ของเครื่องมือสร้าง
สร้างการควบคุมสถานะการโหลดล่วงหน้าเป้าหมาย
เมื่อสร้าง DefaultPreloadManager.Builder
คุณจะส่งออบเจ็กต์
การควบคุมสถานะการโหลดล่วงหน้าเป้าหมายที่กำหนด ออบเจ็กต์นี้ใช้
อินเทอร์เฟซ TargetPreloadStatusControl
เมื่อตัวจัดการการโหลดล่วงหน้า
พร้อมที่จะโหลดสื่อล่วงหน้าแล้ว ตัวจัดการจะเรียกใช้เมธอด getTargetPreloadStatus()
ของการควบคุมสถานะเพื่อดูว่าควรโหลดเนื้อหามากน้อยเพียงใด
การควบคุมสถานะสามารถตอบกลับด้วยรหัสสถานะต่อไปนี้
STAGE_SPECIFIED_RANGE_LOADED
: ตัวจัดการการโหลดล่วงหน้าควรโหลด เนื้อหาจากตำแหน่งเริ่มต้นที่ระบุและตามระยะเวลาที่ระบุ (ระบุเป็นมิลลิวินาที)STAGE_TRACKS_SELECTED
: ตัวจัดการการโหลดล่วงหน้าควรโหลดและประมวลผลข้อมูลของแทร็กเนื้อหา แล้วเลือกแทร็ก ตัวจัดการการโหลดล่วงหน้า ไม่ควรเริ่มโหลดเนื้อหาในตอนนี้STAGE_SOURCE_PREPARED
: ตัวจัดการการโหลดล่วงหน้าควรเตรียมแหล่งที่มาของเนื้อหา เช่น หากข้อมูลเมตาของเนื้อหาอยู่ในไฟล์ Manifest แยกต่างหาก เครื่องมือจัดการการโหลดล่วงหน้าอาจดึงข้อมูลและแยกวิเคราะห์ Manifest นั้นnull
: ตัวจัดการการโหลดล่วงหน้าไม่ควรโหลดเนื้อหาหรือข้อมูลเมตาสำหรับรายการสื่อนั้น
คุณจะต้องมีกลยุทธ์ในการตัดสินใจว่าจะโหลดเนื้อหามากน้อยเพียงใดสำหรับ รายการสื่อแต่ละรายการ ในตัวอย่างนี้ ระบบจะโหลดเนื้อหาเพิ่มเติมสำหรับรายการที่อยู่ใกล้กับ รายการที่กำลังเล่นมากที่สุด หากผู้ใช้เล่นเนื้อหาที่มีดัชนี n คอนโทรลเลอร์จะแสดงรหัสต่อไปนี้
- ดัชนี n+1 (รายการสื่อถัดไป): โหลด 3000 มิลลิวินาที (3 วินาที) จาก ตำแหน่งเริ่มต้นเริ่มต้น
- ดัชนี n-1 (รายการสื่อก่อนหน้า): โหลด 1,000 มิลลิวินาที (1 วินาที) จาก ตำแหน่งเริ่มต้นเริ่มต้น
- รายการสื่ออื่นๆ ในช่วง n-2 ถึง n+2: Return
PreloadStatus.TRACKS_SELECTED
- รายการสื่ออื่นๆ ในช่วง n-4 ถึง n+4: ส่งคืน
PreloadStatus.SOURCE_PREPARED
- สำหรับรายการสื่ออื่นๆ ทั้งหมด ให้ส่งคืน
null
class MyTargetPreloadStatusControl(
currentPlayingIndex: Int = C.INDEX_UNSET
): TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {
override fun getTargetPreloadStatus(index: Int):
DefaultPreloadManager.PreloadStatus? {
if (index - currentPlayingIndex == 1) { // next track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (index - currentPlayingIndex == -1) { // previous track
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
// and suggest loading 3000ms from the default start position
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
} else if (abs(index - currentPlayingIndex) == 2) {
// return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
} else if (abs(index - currentPlayingIndex) <= 4) {
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
}
return null
}
}
ประเด็นสำคัญเกี่ยวกับโค้ด
- คุณจะส่งอินสแตนซ์ของ
MyTargetPreloadStatusControl
ไปยังเครื่องมือสร้างตัวจัดการการโหลดล่วงหน้า เมื่อสร้าง currentPlayingIndex
จะเก็บดัชนีของรายการสื่อที่กำลังเล่นอยู่ แอปมีหน้าที่อัปเดตค่าดังกล่าวให้เป็นปัจจุบันอยู่เสมอ- เมื่อตัวจัดการการโหลดล่วงหน้าพร้อมที่จะโหลดเนื้อหาแล้ว ระบบจะเรียกใช้
getTargetPreloadStatus
และส่งข้อมูลการจัดอันดับที่คุณระบุ สำหรับรายการสื่อที่เกี่ยวข้องนั้น ในกรณีของDefaultPreloadManager
, ข้อมูลการจัดอันดับนั้นเป็นจำนวนเต็มที่ระบุตำแหน่งของสินค้าใน ภาพสไลด์ เมธอดจะเลือกรหัสที่จะแสดงผลโดยการเปรียบเทียบดัชนีนั้น กับดัชนีของรายการที่เลือกอยู่ในปัจจุบัน
สร้างเครื่องมือจัดการการโหลดล่วงหน้า
หากต้องการสร้างเครื่องมือจัดการการโหลดล่วงหน้า คุณต้องมี DefaultPreloadManager.Builder
โดยจะมีการกำหนดค่าเครื่องมือสร้างดังกล่าวด้วยบริบทปัจจุบันและการควบคุมสถานะการโหลดล่วงหน้าเป้าหมายของแอป นอกจากนี้ ตัวสร้างยังมีเมธอด Setter ซึ่งคุณใช้เพื่อ
ตั้งค่าคอมโพเนนต์ที่กำหนดเองของเครื่องมือจัดการการโหลดล่วงหน้าได้
นอกเหนือจากการใช้เครื่องมือสร้างเพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้าแล้ว คุณยังใช้เครื่องมือนี้เพื่อสร้างออบเจ็กต์ ExoPlayer
ที่แอปใช้เพื่อเล่นเนื้อหาได้ด้วย
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()
ประเด็นสำคัญเกี่ยวกับโค้ด
MyTargetPreloadStatusControl
คือคลาสที่คุณกำหนดไว้ในสร้างการควบคุมสถานะการโหลดล่วงหน้าเป้าหมาย- คุณจะใช้
DefaultPreloadManager.Builder
เดียวกันเพื่อสร้างออบเจ็กต์ExoPlayer
ที่จะเล่นเนื้อหาที่จัดการโดยเครื่องมือจัดการการโหลดล่วงหน้านั้น