จัดการและเล่นเนื้อหา

หน้านี้อธิบายวิธีใช้เครื่องมือจัดการการโหลดล่วงหน้าเพื่อจัดการเนื้อหาวิดีโอ การใช้เครื่องมือจัดการการโหลดล่วงหน้าจะช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้น เมื่อผู้ใช้เปลี่ยนจากรายการสื่อหนึ่งไปยังอีกรายการหนึ่ง การเล่นจะเริ่มเร็วขึ้นเนื่องจากเครื่องมือจัดการได้โหลดเนื้อหาบางส่วนไว้แล้ว

หน้านี้ครอบคลุมหัวข้อต่อไปนี้

เพิ่มรายการสื่อลงในเครื่องมือจัดการการโหลดล่วงหน้า

คุณต้องแจ้งให้เครื่องมือจัดการการโหลดล่วงหน้าทราบเกี่ยวกับรายการสื่อแต่ละรายการที่จะติดตาม เช่น หากแอปมีภาพสไลด์ของวิดีโอ คุณจะต้องเพิ่มวิดีโอเหล่านั้นลงในเครื่องมือจัดการการโหลดล่วงหน้า คุณอาจเพิ่มวิดีโอทั้งหมดหรือเฉพาะวิดีโอทั้งหมดใกล้วิดีโอที่กำลังเล่นอยู่ก็ได้ ทั้งนี้ขึ้นอยู่กับ Use Case นอกจากนี้ คุณยังเพิ่มรายการใหม่ลงในเครื่องมือจัดการการโหลดล่วงหน้าได้ในภายหลัง

หากต้องการทำเช่นนี้ ให้ใช้วิธีการเพิ่มแบบเป็นชุด เช่น addMediaItems หรือจะเรียกใช้ add (หรือ addMediaSource) เพื่อเพิ่มรายการสื่อทีละรายการก็ได้ อย่างไรก็ตาม การเพิ่มรายการสื่อทีละรายการจะไม่ทริกเกอร์การโหลดล่วงหน้าโดยอัตโนมัติ เมื่อใช้วิธีการเพิ่มทีละรายการ คุณต้องเรียกใช้ invalidate อย่างชัดเจนเมื่อเพิ่มรายการเสร็จแล้ว เพื่อบอกเครื่องมือจัดการการโหลดล่วงหน้าให้อัปเดตลำดับความสำคัญและเริ่ม โหลดล่วงหน้า

val initialMediaItems = pullMediaItemsFromService(count = 20)
val rankingDataList = initialMediaItems.indices.toList()
preloadManager.addMediaItems(initialMediaItems, rankingDataList)

ประเด็นสำคัญเกี่ยวกับโค้ด

  • ข้อมูลโค้ดนี้แสดงวิธีป้อนข้อมูลเริ่มต้นในเครื่องมือจัดการการโหลดล่วงหน้าในโหมดเป็นชุดหลังจากที่คุณสร้างแล้ว คุณสามารถเรียกใช้ addMediaItems เพื่อเพิ่มรายการไปยังเครื่องมือจัดการการโหลดล่วงหน้าที่มีอยู่ ซึ่งมีข้อมูลอยู่แล้วได้
  • ในข้อมูลโค้ดนี้ pullMediaItemsFromService() คือตรรกะของแอปในการดึงข้อมูลรายการเนื้อหาที่จะเล่น โค้ดจะเรียกใช้เมธอดนั้นเพื่อดึงข้อมูลรายการสูงสุด 20 รายการ
  • preloadManager คือ DefaultPreloadManager ที่สร้างขึ้นในสร้าง DefaultPreloadManager
  • rankingData คือค่าที่เครื่องมือจัดการการโหลดล่วงหน้าใช้เพื่อกำหนดลำดับความสำคัญของรายการสื่อแต่ละรายการ สำหรับ DefaultPreloadManager นั้น rankingData คือจำนวนเต็มที่แสดงตำแหน่งของรายการในภาพสไลด์ เครื่องมือจัดการการโหลดล่วงหน้า จะกำหนดลำดับความสำคัญตามระยะห่างของแต่ละรายการจากรายการที่กำลังเล่นอยู่

ดึงและเล่นสื่อ

เมื่อผู้ใช้ไปยังรายการสื่อใหม่ คุณจะต้องรับรายการสื่อจาก เครื่องมือจัดการการโหลดล่วงหน้า หากเครื่องมือจัดการการโหลดล่วงหน้าโหลดเนื้อหาใดๆ ไว้ เนื้อหาจะเล่นได้เร็วกว่าในกรณีที่คุณไม่ได้ใช้เครื่องมือจัดการการโหลดล่วงหน้า หากเครื่องมือจัดการการโหลดล่วงหน้ายังไม่ได้โหลดเนื้อหาจากรายการนั้น เนื้อหาจะเล่นตามปกติ

นอกจากนี้ คุณยังต้องอัปเดตดัชนีการเล่นปัจจุบันในเครื่องมือจัดการการโหลดล่วงหน้าโดยเรียกใช้ setCurrentPlayingIndex ซึ่งจะช่วยให้เครื่องมือจัดการการโหลดล่วงหน้ากำหนดลำดับความสำคัญของการดำเนินการโหลดล่วงหน้าในอนาคตได้

// When a media item is about to be displayed on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If the mediaSource is null, its mediaItem hasn't been added to the preload
  // manager yet. Send it directly to the player when it's about to play.
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is being displayed at the center of the screen ("in focus")
player.play()
// Update the current playing index to let the preload manager know where the user
// is in the carousel/pagination/list.
preloadManager.setCurrentPlayingIndex(currentIndex)

ประเด็นสำคัญเกี่ยวกับโค้ด

  • player คือ Media3 ExoPlayer ที่แอปใช้เล่นเนื้อหา คุณ ต้องสร้างเพลเยอร์ดังกล่าวโดยเรียกใช้ DefaultPreloadManager.Builder.buildExoPlayer() ในบิลเดอร์เดียวกันกับที่ ใช้สร้างเครื่องมือจัดการการโหลดล่วงหน้า
  • เมื่อผู้ใช้เปลี่ยนไปใช้รายการสื่อใหม่ แอปจะเรียกใช้ getMediaSource() เพื่อรับแหล่งที่มาของสื่อจากเครื่องมือจัดการการโหลดล่วงหน้า ซึ่งต้องเป็น mediaItem ที่คุณเพิ่มลงในเครื่องมือจัดการการโหลดล่วงหน้าแล้ว ไม่เป็นไรหาก เครื่องมือจัดการการโหลดล่วงหน้ายังไม่ได้เริ่มโหลดเนื้อหา ในกรณีนี้ เครื่องมือจะ แสดงผล MediaSource ที่ไม่มีข้อมูลที่โหลดล่วงหน้า เช่น กรณีที่ผู้ใช้ข้ามไปยังตำแหน่งที่ไกลออกไปในภาพสไลด์อย่างกะทันหัน
  • หลังจากที่ผู้ใช้เล่นรายการสื่อใหม่แล้ว ให้เรียกใช้ setCurrentPlayingIndex เพื่อบอกเครื่องมือจัดการการโหลดล่วงหน้าว่ารายการใหม่นี้อยู่ในส่วนใดของภาพสไลด์ เครื่องมือจัดการการโหลดล่วงหน้าต้องใช้ข้อมูลดังกล่าวเพื่อจัดลําดับความสําคัญในการโหลดรายการถัดไป

นำรายการออกจากเครื่องมือจัดการการโหลดล่วงหน้า

คุณควรนำรายการที่เครื่องมือจัดการการโหลดล่วงหน้าไม่จำเป็นต้องติดตามออกเพื่อให้เครื่องมือจัดการการโหลดล่วงหน้าทำงานได้อย่างมีประสิทธิภาพ นอกจากนี้ คุณยังอาจนำรายการที่ยังอยู่ใน ภาพสไลด์ออกได้ด้วย หากอยู่ไกลจากตำแหน่งปัจจุบันของผู้ใช้ ตัวอย่างเช่น คุณอาจตัดสินใจว่าหากรายการอยู่ห่างจากสิ่งที่ผู้ใช้ กำลังดูมากกว่า 15 รายการ ก็ไม่จำเป็นต้องโหลดล่วงหน้า ในกรณีนี้ คุณจะนำรายการออก เมื่อรายการอยู่ไกลออกไป หากผู้ใช้เลื่อนกลับไปที่รายการที่นำออก คุณจะเพิ่มรายการกลับได้ทุกเมื่อ

หากมีรายการสื่อที่ต้องการนำออก คุณสามารถใช้ removeMediaItems ได้ หรือจะเรียกใช้ remove (หรือ removeMediaSource) เพื่อนำรายการสื่อออกทีละรายการก็ได้

preloadManager.removeMediaItems(mediaItemsToRemove)

ประเด็นสำคัญเกี่ยวกับโค้ด

ปล่อยเครื่องมือจัดการการโหลดล่วงหน้าเมื่อใช้งานเสร็จแล้ว

เมื่อไม่ต้องการใช้เครื่องมือจัดการการโหลดล่วงหน้าอีกต่อไป คุณต้องปล่อยเครื่องมือเพื่อเพิ่มพื้นที่ว่างให้กับทรัพยากร โดยเฉพาะอย่างยิ่ง อย่าลืมปล่อยเครื่องมือเมื่อกิจกรรมของคุณถูกทำลาย

preloadManager.release()

ประเด็นสำคัญเกี่ยวกับโค้ด

  • คุณ ต้องไม่ เรียกใช้เมธอดใดๆ ของออบเจ็กต์หลังจากปล่อยออบเจ็กต์แล้ว
  • หากต้องการสร้างเครื่องมือจัดการการโหลดล่วงหน้าอีกเครื่อง ให้สร้าง DefaultPreloadManager.Builder ใหม่และใช้เครื่องมือดังกล่าวเพื่อสร้าง DefaultPreloadManager อย่าพยายามใช้เครื่องมือสร้างเก่าซ้ำ