Kolejkowanie

Platforma Cast udostępnia klasy kolejkowania, które umożliwiają tworzenie list instancji MediaQueueItem. Można je tworzyć z instancji MediaInfo, takich jak strumienie wideo lub audio, aby odtwarzać je sekwencyjnie na odbiorniku. Tę kolejkę elementów treści można edytować, zmieniać jej kolejność, aktualizować itd.

Pakiet SDK odbiornika utrzymuje kolejkę i reaguje na operacje na niej, dopóki jest w niej co najmniej 1 aktywny element (odtwarzany lub wstrzymany). Nadawcy mogą dołączyć do sesji i dodawać elementy do kolejki. Odbiorca utrzymuje sesję dla elementów kolejki, dopóki ostatni element nie zostanie odtworzony lub nadawca nie zatrzyma odtwarzania i nie zakończy sesji albo dopóki nadawca nie załaduje nowej kolejki na odbiorniku. Odbiorca domyślnie nie przechowuje żadnych informacji o zakończonych kolejkach. Po zakończeniu ostatniego elementu w kolejce sesja multimedialna się kończy, a kolejka znika.

Tworzenie i wczytywanie elementów kolejki multimediów

Element kolejki multimediów jest reprezentowany w platformie Cast jako instancja MediaQueueItem. Jeśli podczas tworzenia elementu kolejki multimediów używasz biblioteki odtwarzacza multimediów z treściami adaptacyjnymi, możesz ustawić czas wstępnego wczytywania, aby odtwarzacz mógł rozpocząć buforowanie elementu kolejki multimediów, zanim zakończy się odtwarzanie elementu, który znajduje się przed nim w kolejce. Ustawienie atrybutu autoodtwarzania elementu na wartość „true” umożliwia odbiornikowi automatyczne odtwarzanie. Możesz na przykład użyć wzorca budowniczego, aby utworzyć element kolejki multimediów w ten sposób:

Kotlin
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

Wczytaj tablicę elementów kolejki multimediów w kolejce, używając odpowiedniej metody queueLoad klasy RemoteMediaClient.

Otrzymywanie informacji o stanie kolejki multimediów

Gdy odbiornik wczytuje element kolejki multimediów, przypisuje mu unikalny identyfikator, który jest zachowywany przez cały czas trwania sesji (i istnienia kolejki). Aplikacja może poznać stan kolejki, czyli dowiedzieć się, który element jest obecnie wczytany (nie musi być odtwarzany), wczytywany lub wstępnie wczytany. Klasa MediaStatus dostarcza te informacje o stanie:

  • Metoda getPreloadedItemId() – jeśli następny element został wstępnie wczytany, zwraca identyfikator produktu wstępnie wczytanego elementu.
  • Metoda getLoadingItemId() – zwraca identyfikator produktu, który jest obecnie wczytywany (ale nie jest aktywny w kolejce) na odbiorniku.
  • getCurrentItemId() – zwraca identyfikator produktu, który był aktywny w kolejce (mógł nie być odtwarzany) w momencie zmiany stanu multimediów.
  • Metoda getQueueItems() (wycofana, użyj zamiast niej MediaQueue) – zwraca listę instancji MediaQueueItem jako listę, której nie można modyfikować.

Aplikacja może też pobrać listę elementów za pomocą klasy MediaQueue. Klasa jest rozproszonym modelem danych kolejki multimediów. Przechowuje listę identyfikatorów produktów w kolejce, która jest automatycznie synchronizowana z odbiornikiem. MediaQueue nie przechowuje wszystkich MediaQueueItem, ponieważ zajęłoby to zbyt dużo pamięci, gdy kolejka jest bardzo długa. Zamiast tego pobiera elementy na żądanie i przechowuje LruCache ostatnio używanych elementów. Aby uzyskać dostęp do kolejki multimediów, możesz użyć tych metod:

  • Metoda getItemIds() – zwraca listę wszystkich identyfikatorów produktów w kolejności.
  • Metoda getItemAtIndex() zwraca element z pamięci podręcznej o podanym indeksie. Jeśli element nie jest przechowywany w pamięci podręcznej, MediaQueue zwróci null i zaplanuje pobranie elementu. Gdy element zostanie pobrany, zostanie wywołana metoda MediaQueue.Callback#itemsUpdatedAtIndexes(), a ponowne wywołanie metody getItemAtIndex() z tym samym identyfikatorem zwróci element.
  • fetchMoteItemsRelativeToIndex() jest używana, gdy użytkownik przewija interfejs kolejki do góry lub do dołu, a aplikacja chce pobrać więcej elementów z chmury.

Używaj tych metod razem z innymi metodami stanu multimediów, aby informować aplikację o stanie kolejki i elementów w kolejce. Oprócz aktualizacji stanu multimediów z odbiornika aplikacja może nasłuchiwać zmian w kolejce, implementując metody RemoteMediaClient.Callback i MediaQueue.Callback.

Pakiet SDK Cast udostępnia też 2 klasy narzędzi do tworzenia interfejsu kolejkowania.

Aby na przykład utworzyć RecyclerView za pomocą MediaQueueRecyclerViewAdapter:

Kotlin
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);
}

Edytowanie kolejki

Aby wykonywać operacje na elementach w kolejce, użyj metod kolejki klasy RemoteMediaClient. Umożliwiają one wczytanie tablicy elementów do nowej kolejki, wstawianie elementów do istniejącej kolejki, aktualizowanie właściwości elementów w kolejce, przesuwanie elementu do przodu lub do tyłu w kolejce, ustawianie właściwości samej kolejki (np. zmiana algorytmu repeatMode, który wybiera następny element), usuwanie elementów z kolejki i zmienianie kolejności elementów w kolejce.