очередь

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

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

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

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

Котлин
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() возвращает идентификатор элемента, который в данный момент загружается (но не активен в очереди) на приемнике.
  • Метод getCurrentItemId() возвращает идентификатор элемента, который был активен в очереди (возможно, он не воспроизводился) в момент изменения статуса медиафайла.
  • Метод ` getQueueItems() ` ( устарел, используйте MediaQueue ) возвращает список экземпляров MediaQueueItem в виде неизменяемого списка.

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

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

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

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

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