อยู่ในคิว

เฟรมเวิร์กการแคสต์มีคลาสการจัดคิวที่รองรับการสร้างรายการอินสแตนซ์ MediaQueueItem ซึ่งสามารถสร้างจากอินสแตนซ์ MediaInfo เช่น สตรีมวิดีโอหรือเสียง เพื่อเล่นตามลำดับบนเครื่องรับ คิวของรายการเนื้อหานี้จะแก้ไข เรียงลำดับใหม่ อัปเดต ฯลฯ ได้

SDK ตัวรับจะรักษาคิวและตอบสนองการดำเนินการในคิวตราบใดที่คิวมีรายการที่ใช้งานอยู่อย่างน้อย 1 รายการ (เล่นหรือหยุดชั่วคราว) ผู้ส่งสามารถเข้าร่วมเซสชันและเพิ่มรายการลงในคิวได้ ผู้รับเก็บเซสชันสำหรับรายการในคิวไว้จนกว่ารายการสุดท้ายจะเล่นเสร็จ หรือผู้ส่งหยุดการเล่นและสิ้นสุดเซสชัน หรือจนกว่าผู้ส่งจะโหลดคิวใหม่บนเครื่องรับ โดยค่าเริ่มต้น ตัวรับสัญญาณจะไม่เก็บข้อมูล เกี่ยวกับคิวที่สิ้นสุดแล้ว เมื่อรายการสุดท้ายในคิวสิ้นสุดลง เซสชันสื่อจะสิ้นสุดลงและคิวจะหายไป

สร้างและโหลดรายการในคิวสื่อ

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

Kotlin
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
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 สำหรับการจัดคิวด้วย

เช่น หากต้องการสร้าง RecyclerView โดยใช้ MediaQueueRecyclerViewAdapter ให้ทำดังนี้

Kotlin
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
}
Java
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 ที่เลือกรายการถัดไป) นำรายการออกจากคิว และเรียงลำดับรายการใหม่ในคิว