Фреймворк 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 предоставляет два служебных класса для создания пользовательского интерфейса для очередей.
-
MediaQueueRecyclerViewAdapter
, для поддержки данныхRecyclerView
-
MediaQueueListAdapter
, для поддержки данныхListAdapter
.
Например, чтобы создать 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
, который выбирает следующий элемент), удалять элементы из очереди и переупорядочивать элементы в очереди.