เฟรมเวิร์ก Cast มีคลาสการจัดคิวที่รองรับการสร้างรายการอินสแตนซ์ MediaQueueItem ซึ่งสร้างได้จากอินสแตนซ์ MediaInfo เช่น สตรีมวิดีโอหรือเสียง เพื่อเล่นตามลำดับในตัวรับสัญญาณ คุณสามารถแก้ไข จัดลำดับใหม่ อัปเดต และอื่นๆ กับคิวของรายการเนื้อหานี้ได้
Receiver SDK จะรักษาคิวและตอบสนองต่อการดำเนินการในคิวตราบใดที่คิวมีรายการที่ใช้งานอยู่ (กำลังเล่นหรือหยุดชั่วคราว) อย่างน้อย 1 รายการ ผู้ส่งจะเข้าร่วมเซสชันและเพิ่มรายการลงในคิวได้ ตัวรับจะคงเซสชันไว้สำหรับรายการในคิวจนกว่ารายการสุดท้ายจะเล่นเสร็จ หรือผู้ส่งหยุดการเล่นและสิ้นสุดเซสชัน หรือจนกว่าผู้ส่งจะโหลดคิวใหม่ในตัวรับ โดยค่าเริ่มต้น ตัวรับจะไม่เก็บข้อมูลเกี่ยวกับคิวที่สิ้นสุดแล้ว เมื่อรายการสุดท้ายในคิวเล่นจบแล้ว เซสชันสื่อจะสิ้นสุดลงและคิวจะหายไป
สร้างและโหลดรายการคิวสื่อ
รายการคิวสื่อจะแสดงในเฟรมเวิร์ก Cast เป็นอินสแตนซ์ MediaQueueItem
เมื่อสร้างรายการคิวสื่อ หากคุณใช้ไลบรารีมีเดียเพลเยอร์กับเนื้อหาแบบปรับอัตโนมัติ คุณสามารถตั้งค่าเวลาโหลดล่วงหน้าเพื่อให้เพลเยอร์เริ่มบัฟเฟอร์รายการคิวสื่อก่อนที่รายการก่อนหน้าในคิวจะเล่นจบ การตั้งค่าแอตทริบิวต์การเล่นอัตโนมัติของรายการเป็น "จริง" จะช่วยให้ตัวรับสัญญาณเล่นรายการนั้นโดยอัตโนมัติได้ เช่น คุณสามารถใช้รูปแบบ Builder เพื่อสร้างรายการคิวสื่อได้ดังนี้
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20.0) .build()
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20) .build();
โหลดอาร์เรย์ของรายการคิวสื่อในคิวโดยใช้เมธอด queueLoad ที่เหมาะสมของ RemoteMediaClient
รับข้อมูลอัปเดตสถานะคิวสื่อ
เมื่อตัวรับสัญญาณโหลดรายการคิวสื่อ ตัวรับสัญญาณจะกำหนดรหัสที่ไม่ซ้ำกันให้กับรายการซึ่งจะคงอยู่ตลอดระยะเวลาของเซสชัน (และอายุการใช้งานของคิว) แอปของคุณสามารถเรียนรู้สถานะของคิวในแง่ของรายการที่โหลดอยู่ในปัจจุบัน (อาจไม่ได้เล่นอยู่) กำลังโหลด หรือโหลดไว้ล่วงหน้า คลาส MediaStatus จะให้ข้อมูลสถานะต่อไปนี้
- เมธอด
getPreloadedItemId()- หากมีการโหลดรายการถัดไปล่วงหน้าแล้ว จะแสดงรหัสสินค้าที่โหลดล่วงหน้า getLoadingItemId()method - แสดงรหัสสินค้าของรายการที่กำลังโหลดอยู่ (แต่ไม่ได้ทำงานในคิว) บนตัวรับสัญญาณgetCurrentItemId()method - แสดงรหัสรายการของรายการที่ทำงานอยู่ในคิว (อาจไม่ได้กำลังเล่นอยู่) ณ เวลาที่สถานะสื่อมีการเปลี่ยนแปลงgetQueueItems()(เลิกใช้งานแล้ว ให้ใช้MediaQueueแทน) - แสดงผลรายการอินสแตนซ์MediaQueueItemเป็นรายการที่แก้ไขไม่ได้
แอปของคุณยังรับรายการสินค้าได้โดยใช้คลาส MediaQueue คลาสนี้เป็นโมเดลข้อมูลแบบ Sparse ของคิวสื่อ โดยจะเก็บรายการรหัสสินค้าไว้ในคิว ซึ่งจะซิงค์กับตัวรับสัญญาณโดยอัตโนมัติ
MediaQueue ไม่ได้เก็บ MediaQueueItem ทั้งหมดไว้เนื่องจากจะใช้หน่วยความจำมากเกินไปเมื่อคิวยาวมาก แต่จะดึงข้อมูลรายการตามต้องการและเก็บ LruCache ของรายการที่เข้าถึงล่าสุดไว้ คุณสามารถใช้วิธีการต่อไปนี้เพื่อเข้าถึงคิวสื่อ
getItemIds()method - แสดงรายการรหัสสินค้าทั้งหมดตามลำดับ- เมธอด
getItemAtIndex()- แสดงผลรายการที่แคชไว้ที่ดัชนีที่ระบุ หากไม่ได้แคชรายการไว้MediaQueueจะแสดงผลnullและกำหนดเวลาเพื่อดึงข้อมูลรายการ เมื่อดึงข้อมูลรายการแล้ว ระบบจะเรียกใช้MediaQueue.Callback#itemsUpdatedAtIndexes()และการเรียกใช้getItemAtIndex()ด้วยรหัสเดียวกันอีกครั้งจะแสดงรายการนั้น - ระบบจะใช้
fetchMoteItemsRelativeToIndex()เมื่อผู้ใช้เลื่อน UI ของคิวไปด้านบนหรือด้านล่าง และแอปต้องการดึงข้อมูลรายการเพิ่มเติมจากระบบคลาวด์
ใช้วิธีการเหล่านี้ร่วมกับวิธีการสถานะสื่ออื่นๆ เพื่อแจ้งให้แอปทราบเกี่ยวกับสถานะของคิวและรายการในคิว นอกจากการอัปเดตสถานะสื่อจากตัวรับสัญญาณแล้ว แอปของคุณยังฟังการเปลี่ยนแปลงในคิวได้โดยใช้ RemoteMediaClient.Callback และ MediaQueue.Callback
นอกจากนี้ Cast SDK ยังมีคลาสยูทิลิตี 2 คลาสเพื่อสร้าง UI สำหรับการจัดคิว
MediaQueueRecyclerViewAdapterที่สนับสนุนข้อมูลของRecyclerViewMediaQueueListAdapterสำหรับการสำรองข้อมูลของListAdapter
ตัวอย่างเช่น หากต้องการสร้าง RecyclerView โดยใช้ MediaQueueRecyclerViewAdapter ให้ทำดังนี้
class MyRecyclerViewAdapter(mediaQueue: MediaQueue?) : MediaQueueRecyclerViewAdapter<MyViewHolder?>(mediaQueue) { override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val item = getItem(position) // Update the view using `item`. ... } } class MyViewHolder : RecyclerView.ViewHolder { // Implement your own ViewHolder. ... } fun someMethod() { val adapter = MyRecyclerViewAdapter( mCastSession.remoteMediaClient.getMediaQueue()) val recyclerView = activity.findViewById(R.id.my_recycler_view_id) as RecyclerView recyclerView.adapter = adapter }
public class MyRecyclerViewAdapter extends MediaQueueRecyclerViewAdapter<MyViewHolder> { public MyRecyclerViewAdapter(MediaQueue mediaQueue) { super(mediaQueue); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { MediaQueueItem item = getItem(position); // Update the view using `item`. ... } } public class MyViewHolder implements RecyclerView.ViewHolder { // Implement your own ViewHolder. ... } public void someMethod() { RecyclerView.Adapter adapter = new MyRecyclerViewAdapter( mCastSession.getRemoteMediaClient().getMediaQueue()); RecyclerView recyclerView = (RecyclerView) getActivity().findViewById(R.id.my_recycler_view_id); recyclerView.setAdapter(adapter); }
แก้ไขคิว
หากต้องการดำเนินการกับรายการในคิว ให้ใช้เมธอดคิวของคลาส RemoteMediaClient ซึ่งช่วยให้คุณโหลดอาร์เรย์ของรายการลงในคิวใหม่ แทรกรายการลงในคิวที่มีอยู่ อัปเดตพร็อพเพอร์ตี้ของรายการในคิว ทำให้รายการข้ามไปข้างหน้าหรือย้อนกลับในคิว ตั้งค่าพร็อพเพอร์ตี้ของคิวเอง (เช่น เปลี่ยนอัลกอริทึม repeatMode ที่เลือกรายการถัดไป) นำรายการออกจากคิว และจัดลำดับรายการในคิวใหม่