เฟรมเวิร์กการแคสต์มีคลาสการจัดคิวที่รองรับการสร้างรายการอินสแตนซ์ MediaQueueItem
ซึ่งสามารถสร้างจากอินสแตนซ์ MediaInfo
เช่น สตรีมวิดีโอหรือเสียง เพื่อเล่นตามลำดับบนเครื่องรับ คิวของรายการเนื้อหานี้จะแก้ไข
เรียงลำดับใหม่ อัปเดต ฯลฯ ได้
SDK ตัวรับจะรักษาคิวและตอบสนองการดำเนินการในคิวตราบใดที่คิวมีรายการที่ใช้งานอยู่อย่างน้อย 1 รายการ (เล่นหรือหยุดชั่วคราว) ผู้ส่งสามารถเข้าร่วมเซสชันและเพิ่มรายการลงในคิวได้ ผู้รับเก็บเซสชันสำหรับรายการในคิวไว้จนกว่ารายการสุดท้ายจะเล่นเสร็จ หรือผู้ส่งหยุดการเล่นและสิ้นสุดเซสชัน หรือจนกว่าผู้ส่งจะโหลดคิวใหม่บนเครื่องรับ โดยค่าเริ่มต้น ตัวรับสัญญาณจะไม่เก็บข้อมูล เกี่ยวกับคิวที่สิ้นสุดแล้ว เมื่อรายการสุดท้ายในคิวสิ้นสุดลง เซสชันสื่อจะสิ้นสุดลงและคิวจะหายไป
สร้างและโหลดรายการในคิวสื่อ
รายการคิวสื่อจะแสดงเป็นอินสแตนซ์ MediaQueueItem
ในเฟรมเวิร์กของ Cast
เมื่อสร้างรายการคิวสื่อ หากคุณใช้ไลบรารีมีเดียเพลเยอร์ที่มีเนื้อหาแบบปรับอัตโนมัติ คุณสามารถตั้งค่าเวลาในการโหลดล่วงหน้าเพื่อให้โปรแกรมเล่นเริ่มบัฟเฟอร์รายการในคิวสื่อได้ก่อนที่รายการที่อยู่ข้างหน้าในคิวจะเล่นจนจบ การตั้งค่าแอตทริบิวต์เล่นอัตโนมัติของสินค้า
เป็น "จริง" จะทำให้ผู้รับเล่นได้โดยอัตโนมัติ ตัวอย่างเช่น คุณสามารถใช้รูปแบบของเครื่องมือสร้างเพื่อสร้างรายการคิวสื่อได้ดังนี้
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()
เมธอด - แสดงผลรหัสรายการของรายการที่กำลังโหลดอยู่ (แต่ไม่ได้ใช้งานในคิว) บนตัวรับgetCurrentItemId()
เมธอด - แสดงผลรหัสรายการของรายการที่มีการใช้งานอยู่ในคิว (รายการอาจไม่ได้เล่นอยู่) ณ เวลาที่มีการเปลี่ยนแปลงสถานะสื่อgetQueueItems()
(เลิกใช้งานแล้ว ให้ใช้MediaQueue
แทน) - แสดงผลรายการของอินสแตนซ์MediaQueueItem
เป็นรายการที่แก้ไขไม่ได้
แอปยังรับชุดรายการโดยใช้คลาส MediaQueue
ได้ด้วย คลาสคือโมเดลข้อมูลแบบกระจัดกระจายของคิวสื่อ ระบบจะเก็บรายการรหัสสินค้าไว้ในคิว ซึ่งจะซิงค์กับผู้รับโดยอัตโนมัติ
MediaQueue
จะไม่เก็บ
MediaQueueItem
ทั้งหมดไว้เนื่องจากจะใช้หน่วยความจำมากเกินไปเมื่อคิวยาวมาก แต่จะดึงข้อมูลรายการตามคำขอและเก็บ LruCache
ของรายการที่เข้าถึงล่าสุดไว้แทน คุณใช้วิธีการเหล่านี้เพื่อเข้าถึงคิวสื่อได้
getItemIds()
method - แสดงรายการรหัสสินค้าทั้งหมดตามลำดับgetItemAtIndex()
เมธอด - แสดงผลรายการที่แคชไว้ในดัชนีที่ระบุ หากไม่ได้แคชรายการไว้MediaQueue
จะแสดงผลnull
และกำหนดเวลาเพื่อดึงข้อมูลรายการ เมื่อมีการดึงข้อมูลสินค้า ระบบจะเรียกใช้MediaQueue.Callback#itemsUpdatedAtIndexes()
และการเรียกใช้getItemAtIndex()
ด้วยรหัสเดิมอีกครั้งจะส่งสินค้าคืน- ระบบจะใช้
fetchMoteItemsRelativeToIndex()
เมื่อผู้ใช้เลื่อน UI ของคิวไปด้านบนหรือด้านล่าง และแอปต้องการดึงข้อมูลรายการเพิ่มเติมจากระบบคลาวด์
ใช้วิธีการเหล่านี้ร่วมกับวิธีการแสดงสถานะสื่ออื่นๆ เพื่อแจ้งแอปของคุณเกี่ยวกับสถานะของคิวและรายการต่างๆ ในคิว นอกจากการอัปเดตสถานะสื่อจากผู้รับแล้ว แอปของคุณยังฟังการเปลี่ยนแปลงของคิวได้โดยใช้
RemoteMediaClient.Callback
และ
MediaQueue.Callback
นอกจากนี้ Cast SDK ยังมีคลาสยูทิลิตี 2 คลาสในการสร้าง UI สำหรับการจัดคิวด้วย
MediaQueueRecyclerViewAdapter
สำหรับการสำรองข้อมูลของRecyclerView
MediaQueueListAdapter
สำหรับการสำรองข้อมูลของ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
ที่เลือกรายการถัดไป) นำรายการออกจากคิว และเรียงลำดับรายการใหม่ในคิว