หน้านี้จะอธิบายวิธีสร้าง DefaultPreloadManager ซึ่งจะโหลดเนื้อหาสื่อล่วงหน้าสำหรับแอปตามกลยุทธ์ที่คุณเลือก
ตัวจัดการการโหลดล่วงหน้าตามคลาสBasePreloadManager Abstract ช่วยให้คุณ
จัดอันดับเนื้อหาตามเกณฑ์ที่คุณเลือกได้ เอกสารนี้อธิบายวิธีใช้คลาสที่ได้มา DefaultPreloadManager ซึ่งแต่ละรายการสื่อจะได้รับการจัดอันดับด้วย
จำนวนเต็มที่แสดงตำแหน่งในรายการ (เช่น ตำแหน่งใน
ภาพสไลด์วิดีโอ) เครื่องมือจัดการการโหลดล่วงหน้าจะจัดลําดับความสําคัญในการโหลดรายการตาม
ระยะห่างจากรายการที่ผู้ใช้กําลังเล่น ด้วยวิธีนี้ หากผู้ใช้เปลี่ยนไปดู
รายการอื่น รายการใหม่จะเริ่มเล่นได้ทันที
การสร้างอินสแตนซ์ของ DefaultPreloadManager มี 3 ขั้นตอนดังนี้
- กำหนด
TargetPreloadStatusControlที่เครื่องมือจัดการการโหลดล่วงหน้าสามารถ ค้นหาเพื่อดูว่ารายการสื่อพร้อมโหลดหรือไม่และควรโหลด มากน้อยเพียงใด - สร้างเครื่องมือสร้างที่คุณจะใช้เพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้า และ
เพื่อสร้างออบเจ็กต์
ExoPlayerของแอป - ใช้เครื่องมือสร้างเพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้าโดยเรียกใช้เมธอด
build()ของเครื่องมือสร้าง
สร้างการควบคุมสถานะการโหลดล่วงหน้าเป้าหมาย
เมื่อสร้าง DefaultPreloadManager.Builder คุณจะส่งออบเจ็กต์การควบคุมสถานะการโหลดล่วงหน้าเป้าหมายที่กำหนด ออบเจ็กต์นี้ใช้อินเทอร์เฟซ TargetPreloadStatusControl เมื่อเครื่องมือจัดการการโหลดล่วงหน้าพร้อมที่จะโหลดสื่อล่วงหน้า ระบบจะเรียกใช้เมธอด getTargetPreloadStatus() ของการควบคุมสถานะเพื่อพิจารณาว่าจะเตรียม โหลด หรือแคชเนื้อหาสำหรับรายการสื่อหรือไม่ การโหลดล่วงหน้าจะโหลดข้อมูลสื่อลงในบัฟเฟอร์ในหน่วยความจำของเพลเยอร์โดยตรง ทำให้พร้อมสำหรับการเล่นทันที ส่วนการแคชจะบันทึกข้อมูลสื่อลงในแคชดิสก์แบบถาวรเพื่อประหยัดหน่วยความจำของเพลเยอร์ การควบคุมสถานะสามารถตอบกลับด้วยรหัสสถานะใดรหัสหนึ่งต่อไปนี้
STAGE_SPECIFIED_RANGE_LOADED: เครื่องมือจัดการการโหลดล่วงหน้าควรโหลดเนื้อหาจากตำแหน่งเริ่มต้นที่ระบุและตามระยะเวลาที่ระบุ (หน่วยเป็นมิลลิวินาที) ลงในบัฟเฟอร์ในหน่วยความจำของเพลเยอร์STAGE_SPECIFIED_RANGE_CACHED: เครื่องมือจัดการการโหลดล่วงหน้าควรแคชเนื้อหาจากตำแหน่งเริ่มต้นที่ระบุและเป็นระยะเวลาที่ระบุ (เป็นมิลลิวินาที) ลงในแคชดิสก์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(var currentPlayingIndex: Int = 0) : 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.PRELOAD_STATUS_TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED } return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED } }
ประเด็นสำคัญเกี่ยวกับโค้ด
- คุณจะส่งอินสแตนซ์ของ
MyTargetPreloadStatusControlไปยังเครื่องมือสร้างเครื่องมือจัดการการโหลดล่วงหน้าเมื่อสร้าง currentPlayingIndexจะเก็บดัชนีของรายการสื่อที่กำลังเล่นอยู่ แอปมีหน้าที่อัปเดตค่าดังกล่าวให้เป็นปัจจุบันอยู่เสมอ- เมื่อเครื่องมือจัดการการโหลดล่วงหน้าพร้อมที่จะโหลดเนื้อหาแล้ว ระบบจะเรียกใช้
getTargetPreloadStatusและส่งข้อมูลการจัดอันดับที่คุณระบุ สำหรับรายการสื่อที่เกี่ยวข้องนั้น ในกรณีของDefaultPreloadManagerข้อมูลการจัดอันดับนั้นเป็นจำนวนเต็มที่ระบุตำแหน่งของสินค้าใน ภาพสไลด์ เมธอดจะเลือกรหัสที่จะแสดงผลโดยการเปรียบเทียบดัชนีนั้น กับดัชนีของรายการที่เลือกอยู่ในปัจจุบัน
สร้างเครื่องมือจัดการการโหลดล่วงหน้า
หากต้องการสร้างเครื่องมือจัดการการโหลดล่วงหน้า คุณต้องมี DefaultPreloadManager.Builder
โดยจะมีการกำหนดค่าเครื่องมือสร้างดังกล่าวด้วยบริบทปัจจุบันและการควบคุมสถานะการโหลดล่วงหน้าเป้าหมายของแอป คุณสามารถสร้างเครื่องมือจัดการการโหลดล่วงหน้าด้วยการกำหนดค่าเริ่มต้นทั้งหมดได้
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
เครื่องมือสร้างยังมีเมธอด Setter ซึ่งคุณใช้เพื่อ ตั้งค่าคอมโพเนนต์ที่กำหนดเองของเครื่องมือจัดการการโหลดล่วงหน้าได้
เช่น คุณสามารถ
ปรับแต่งไบต์บัฟเฟอร์เป้าหมายทั้งหมดสำหรับแหล่งที่มาของสื่อที่โหลดล่วงหน้าทั้งหมดใน DefaultPreloadManager เพื่อให้ข้อมูลที่โหลดล่วงหน้าไม่เกินขีดจำกัดนั้น คุณกำหนดค่าขีดจำกัดดังกล่าวได้โดยใช้
setPlayerTargetBufferBytes(String, int)
ใน DefaultLoadControl.Builder ที่กำหนดเองซึ่งมีชื่อเพลเยอร์ "preload" และ
ส่งอินสแตนซ์ดังกล่าวไปยังตัวสร้างเครื่องมือจัดการการโหลดล่วงหน้า
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) preloadManagerBuilder.setLoadControl( DefaultLoadControl.Builder() .setPlayerTargetBufferBytes("preload", 128 * 1024 * 1024) // 128 MiB .build() ) val preloadManager = preloadManagerBuilder.build()
แม้ว่าโดยพื้นฐานแล้วเมธอด Setter ของ Builder จะไม่บังคับสำหรับการปรับแต่ง แต่หากต้องการแคชรายการสื่อใดๆ ลงในดิสก์ คุณต้องกำหนดค่า Builder ด้วย Cache โดยการเรียกใช้ setCache() หากไม่ได้กำหนดค่าแคช การพยายามแคชรายการสื่อจะทำให้เกิด IllegalStateException
สร้าง ExoPlayer เพื่อเล่นรายการสื่อที่โหลดล่วงหน้า
นอกเหนือจากการใช้เครื่องมือสร้างเพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้าแล้ว คุณยังใช้เครื่องมือนี้เพื่อ
สร้างออบเจ็กต์ ExoPlayer ที่แอปใช้เพื่อเล่นเนื้อหา เพื่อให้ ExoPlayer แชร์คอมโพเนนต์กับเครื่องมือจัดการการโหลดล่วงหน้าได้อย่างถูกต้อง คุณยังคงตั้งค่าการเล่นที่เฉพาะเจาะจงสำหรับ ExoPlayer ได้โดยส่งอินสแตนซ์ ExoPlayer.Builder ที่มีการตั้งค่าเหล่านั้น
// Direct creation val exoPlayer = preloadManagerBuilder.buildExoPlayer() // Creation with custom playback specific configurations val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true) val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)