อยู่ในคิว

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

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

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

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

โคตลิน
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() เมธอด - แสดงผลรายการของรหัสรายการทั้งหมดตามลําดับ
  • getItemAtIndex() วิธี - แสดงผลรายการที่แคชไว้ในดัชนีที่กําหนด หากไม่ได้แคชรายการไว้ MediaQueue จะส่งกลับ null และกําหนดเวลาเพื่อเรียกข้อมูลรายการนั้น เมื่อมีการเรียกข้อมูลรายการ จะมีการเรียกใช้ MediaQueue.Callback#itemsUpdatedAtIndexes() และการเรียกใช้ getItemAtIndex() ด้วยรหัสเดียวกันอีกครั้งจะเป็นการแสดงรายการนั้น
  • fetchMoteItemsRelativeToIndex() จะใช้เมื่อผู้ใช้เลื่อน UI คิวไปด้านบนหรือด้านล่าง และแอปต้องการดึงรายการจากระบบคลาวด์เพิ่มเติม

ใช้วิธีการเหล่านี้ร่วมกับวิธีสถานะสื่ออื่นๆ เพื่อแจ้งให้แอปทราบสถานะของคิวและรายการในคิว นอกจากการอัปเดตสถานะสื่อจากผู้รับแล้ว แอปของคุณยังฟังการเปลี่ยนแปลงของคิวได้ด้วยการใช้ RemoteMediaClient.Callback และ MediaQueue.Callback

นอกจากนี้ Cast SDK ยังมีคลาสยูทิลิตี 2 คลาสที่จะสร้าง UI สําหรับคิว

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