Cast 框架提供排队类,支持创建列表
的 MediaQueueItem
实例,这些实例可以从 MediaInfo 实例(例如视频或音频
流)构建,以便在接收器上按顺序播放。您可以修改、重新排序、更新此内容项队列,等等。
只要队列中至少有一个项当前处于活动状态(正在播放或已暂停),接收器 SDK 就会维护队列并响应对队列执行的操作。发送者可以加入会话并将项添加到队列中。接收器会为队列项维护会话,直到最后一个项播放完毕或发送者停止播放并终止会话,或者直到发送者在接收器上加载新队列。默认情况下,接收器不会维护有关已终止队列的任何信息。队列中的最后一个项播放完毕后,媒体会话结束,队列消失。
创建和加载媒体队列项
在 Cast 框架中,媒体队列项表示为
MediaQueueItem
实例。
创建媒体队列项时,如果您使用的是媒体播放器
库和自适应内容,则可以设置
预加载时间,以便播放器可以在队列中排在前面的项播放完毕之前开始缓冲媒体队列项。将项的自动播放属性设置为 true 可让接收器自动播放该项。例如,您可以使用构建器模式创建媒体队列项,如下所示:
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。
接收媒体队列状态更新
当接收器加载媒体队列项时,它会为该项分配一个唯一 ID,该 ID 在会话期间(以及队列的生命周期内)保持不变。您的应用可以了解队列的状态,包括当前加载的项(可能未播放)、正在加载的项或预加载的项。
MediaStatus
类提供此状态信息:
getPreloadedItemId()方法 - 如果下一个项已预加载,则返回预加载的项 ID。getLoadingItemId()方法 - 返回接收器上当前正在加载(但未在队列中处于活动状态)的项的项 ID。getCurrentItemId()方法 - 返回媒体状态发生变化时在队列中处于活动状态(可能未播放)的项的项 ID。getQueueItems()(已废弃,请改用MediaQueue)方法 - 以不可修改的列表形式返回MediaQueueItem实例的列表。
您的应用还可以使用
MediaQueue
类获取项列表。该类是媒体队列的稀疏数据模型。它会保留队列中的项 ID 列表,该列表会自动与接收器同步。
MediaQueue 不会保留所有
MediaQueueItem
,因为当队列非常长时,它会占用过多内存。相反,它会按需提取项,并保留最近访问的项的 LruCache。您可以使用以下方法访问媒体队列:
getItemIds()方法 - 按顺序返回所有项 ID 的列表。getItemAtIndex()方法 - 返回给定索引处的缓存项。如果该项未缓存,MediaQueue将返回null并安排提取该项。提取该项 后,MediaQueue.Callback#itemsUpdatedAtIndexes()会调用,再次使用同一 ID 调用getItemAtIndex()将 返回该项。fetchMoteItemsRelativeToIndex()当用户将队列界面滚动到顶部或底部时, 您的应用想要从云端提取更多项。
将这些方法与其他媒体状态方法结合使用,以告知您的应用队列的状态以及队列中的项。除了
接收器提供的媒体状态更新之外,您的应用还可以通过实现
RemoteMediaClient.Callback
和
MediaQueue.Callback来监听
队列的变化。
此外,Cast SDK 还提供了两个实用程序类来为排队创建界面。
MediaQueueRecyclerViewAdapter, 用于支持RecyclerView的数据MediaQueueListAdapter, 用于支持ListAdapter的数据。
例如,如需使用 MediaQueueRecyclerViewAdapter 创建 RecyclerView,请执行以下操作:
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 算法),从队列中移除项,以及对队列中的项重新排序。