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