Очередь

В фреймворке Cast есть классы для создания очередей, которые поддерживают создание списков экземпляров MediaQueueItem. Эти списки можно создавать на основе экземпляров MediaInfo, например видео- или аудиопотоков, которые будут воспроизводиться на приемнике последовательно. Этот список можно редактировать, менять порядок элементов, обновлять и т. д.

Receiver SDK поддерживает очередь и реагирует на операции с ней, пока в ней есть хотя бы один активный элемент (воспроизводимый или приостановленный). Отправители могут присоединиться к сеансу и добавить элементы в очередь. Получатель поддерживает сеанс для элементов очереди, пока последний элемент не будет воспроизведен или отправитель не остановит воспроизведение и не завершит сеанс, или пока отправитель не загрузит новую очередь на получателе. По умолчанию приемник не хранит информацию о завершенных очередях. Когда воспроизведение последнего элемента в очереди завершается, сеанс воспроизведения заканчивается и очередь исчезает.

Как создавать и загружать элементы очереди воспроизведения медиаконтента

Элемент очереди медиаконтента представлен в фреймворке Cast как экземпляр класса MediaQueueItem. При создании элемента очереди воспроизведения, если вы используете библиотеку медиапроигрывателя с адаптивным контентом, можно задать время предварительной загрузки, чтобы проигрыватель начал буферизацию элемента очереди до того, как закончится воспроизведение предыдущего элемента. Если для атрибута autoplay задано значение 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.

Получение обновлений статуса очереди медиафайлов

Когда получатель загружает объект очереди мультимедиа, он присваивает ему уникальный идентификатор, который сохраняется на протяжении сеанса (и срока существования очереди). Приложение может узнать статус очереди: какой объект загружен (но не обязательно воспроизводится), загружается или предварительно загружен. Класс MediaStatus предоставляет следующую информацию о статусе:

  • getPreloadedItemId() метод – если следующий элемент был предварительно загружен, возвращает его идентификатор.
  • getLoadingItemId() method – возвращает идентификатор элемента, который в данный момент загружается на приемнике (но не активен в очереди).
  • getCurrentItemId() method – возвращает идентификатор объекта, который был активен в очереди (но не обязательно воспроизводился) в момент изменения статуса мультимедиа.
  • Метод getQueueItems() (устаревший, используйте MediaQueue) возвращает список экземпляров MediaQueueItem в виде неизменяемого списка.

Приложение также может получить список объектов с помощью класса MediaQueue. Класс представляет собой разреженную модель данных очереди воспроизведения. Он хранит список идентификаторов объектов в очереди, который автоматически синхронизируется с приемником. MediaQueue не хранит все объекты MediaQueueItem, потому что при длинной очереди это займет слишком много памяти. Вместо этого он получает объекты по запросу и хранит LruCache недавно использованных объектов. Чтобы открыть очередь воспроизведения, можно использовать следующие способы:

  • getItemIds() Возвращает список идентификаторов всех товаров в заказе.
  • Метод getItemAtIndex() возвращает кешированный объект с заданным индексом. Если объект не кеширован, MediaQueue вернет null и запланирует его получение. Когда элемент будет получен, будет вызван метод MediaQueue.Callback#itemsUpdatedAtIndexes(), и при повторном вызове метода getItemAtIndex() с тем же идентификатором будет возвращен элемент.
  • fetchMoteItemsRelativeToIndex() используется, когда пользователь прокручивает интерфейс очереди вверх или вниз и ваше приложение хочет получить больше объектов из облака.

Используйте эти методы вместе с другими методами статуса медиа, чтобы информировать ваше приложение о статусе очереди и элементов в очереди. Помимо обновлений статуса медиаконтента от получателя, ваше приложение может отслеживать изменения в очереди, реализовав методы RemoteMediaClient.Callback и MediaQueue.Callback.

Кроме того, Cast SDK предоставляет два класса утилит для создания интерфейса очереди.

Например, чтобы создать 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, который выбирает следующий объект), удалять объекты из очереди и менять порядок объектов в очереди.