очередь

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

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

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

Элемент очереди мультимедиа представлен в фреймворке Cast как экземпляр MediaQueueItem . При создании элемента очереди мультимедиа, если вы используете библиотеку медиаплеера с адаптивным содержимым, вы можете установить время предварительной загрузки, чтобы проигрыватель мог начать буферизацию элемента очереди мультимедиа до того, как элемент, находящийся перед ним в очереди, завершит воспроизведение. Установка атрибута autoplay элемента в значение true позволяет получателю воспроизводить его автоматически. Например, вы можете использовать шаблон Builder для создания элемента очереди мультимедиа следующим образом:

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