สร้างและกำหนดค่า DefaultPreloadManager

หน้านี้อธิบายวิธีสร้าง DefaultPreloadManager ซึ่งโหลด เนื้อหาสื่อล่วงหน้าสำหรับแอปของคุณตามกลยุทธ์ที่คุณเลือก

เครื่องมือจัดการการโหลดล่วงหน้าซึ่งอิงตามคลาสแอบสแตรกต์ BasePreloadManager ช่วยให้คุณ จัดอันดับเนื้อหาตามเกณฑ์ที่เลือกได้ เอกสารนี้อธิบายวิธีใช้คลาสที่ได้มา 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 (รายการสื่อถัดไป): โหลด 3,000 มิลลิวินาที (3 วินาที) จากตำแหน่งเริ่มต้นเริ่มต้น
  • ดัชนี n-1 (รายการสื่อก่อนหน้า): โหลด 1,000 มิลลิวินาที (1 วินาที) จากตำแหน่งเริ่มต้นเริ่มต้น
  • รายการสื่ออื่นๆ ในช่วง n-2 ถึง n+2: แสดงผล 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 ของเครื่องมือสร้างจะเป็นตัวเลือกสำหรับการ ปรับแต่ง แต่หากต้องการแคชรายการสื่อ ลงในดิสก์ คุณต้องกำหนดค่าเครื่องมือสร้างด้วย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)