排队

Cast 框架提供支持创建列表的队列类 共 MediaQueueItem 个 实例,此类实例可以基于视频或音频等 MediaInfo 实例进行构建 以便在接收设备上依序播放。此内容项队列可进行修改、重新排序、更新等操作。

只要队列中至少有一个当前处于活动状态(正在播放或暂停)的内容,接收器 SDK 就会维护队列并响应对队列的操作。发送者可以加入会话并向队列中添加内容。接收方 为队列项维护一个会话,直到最后一个项完成播放或 发送者停止播放并终止会话,或直到发送方停止播放 在接收设备上加载新队列。接收方不会维护任何 有关已终止队列的信息。当队列中的最后一项 则媒体会话结束,队列将消失。

创建和加载媒体队列项

媒体队列项目在 Cast 框架中表示为 MediaQueueItem 实例。 创建媒体队列项时,如果您将媒体播放器库与自适应内容搭配使用,则可以设置预加载时间,以便播放器可以在队列中排在其前面的项播放完毕之前开始缓冲媒体队列项。设置项的自动播放 属性设为 true 可让接收方自动播放音频。例如: 您可以使用构建器模式创建媒体队列项,如下所示:

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 方法。

接收媒体队列状态更新

当接收方加载媒体队列项时,它会为该项分配一个唯一 ID 该 ID 在会话期间(以及队列的生命周期内)保持不变。您的 应用可以根据当前已加载的项来了解队列的状态 (可能未播放)、正在加载或预加载。MediaStatus 类提供以下状态信息:

  • getPreloadedItemId() method - 如果下一项已预加载,则返回预加载项的 ID。
  • getLoadingItemId() 方法 - 返回当前正在加载的项目的项目 ID( 在队列中)。
  • getCurrentItemId() 方法 - 返回队列中的有效项的项 ID(它 可能没有播放)。
  • getQueueItems()已弃用,MediaQueue改用)method - 返回 MediaQueueItem 实例显示为不可修改的列表。

您的应用也可以使用 MediaQueue 类。该类是媒体队列的稀疏数据模型。它会保留 数据项 ID,会自动与接收方同步。 MediaQueue 不会保留所有 MediaQueueItem 因为在队列很长时,这将占用过多内存。相反, 按需提取商品,并LruCache 近期访问过的内容。您可以使用以下方法来访问媒体队列:

将这些方法与其他媒体状态方法结合使用,可告知应用队列的状态和队列中的项。除了 媒体状态更新,您的应用可以监听对 将代码部署到队列中 RemoteMediaClient.CallbackMediaQueue.Callback

此外,Cast SDK 提供了两个实用程序类,用于创建队列界面。

例如,如需使用 MediaQueueRecyclerViewAdapter 创建 RecyclerView,请使用以下代码:

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 算法), 从队列中删除项,并对队列中的项重新排序。