очередь

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

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

Создание и загрузка элементов очереди мультимедиа

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

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

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

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

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

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

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

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

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