Kolejkowanie

Platforma Cast udostępnia klasy kolejkowania, które obsługują tworzenie list instancji MediaQueueItem, które można skompilować na podstawie instancji MediaInfo, takich jak strumienie wideo lub audio, i odtwarzać sekwencyjnie z odbiornika. Elementy w tej kolejce można edytować, zmieniać, aktualizować i aktualizować itd.

Pakiet SDK Receiver obsługuje kolejkę i reaguje na operacje, które się w niej znajdują, dopóki ma ona co najmniej 1 aktywny element (odtwarzany lub wstrzymany). Nadawcy mogą dołączyć do sesji i dodać elementy do kolejki. Odbiorca utrzymuje sesję elementów kolejki do momentu zakończenia odtwarzania ostatniego elementu lub do momentu zatrzymania odtwarzania i zakończenia sesji przez nadawcę albo do momentu załadowania nowej kolejki przez nadawcę. Domyślnie odbiorca nie przechowuje żadnych informacji o zakończonych kolejkach. Gdy skończy się ostatni element w kolejce, sesja multimediów się zakończy, a kolejka znika.

Tworzenie i wczytywanie elementów kolejki multimediów

Element kolejki multimediów jest na platformie Cast reprezentowany jako instancja MediaQueueItem. Jeśli podczas tworzenia elementu kolejki multimediów używasz biblioteki multimediów z treściami adaptacyjnymi, możesz ustawić czas wstępnego wczytywania, tak by odtwarzacz mógł rozpocząć buforowanie elementu kolejki, zanim skończy się odtwarzanie elementu, który się przed nim znajduje. Ustawienie wartości atrybutu autoodtwarzania elementu umożliwia odbiorcy jego automatyczne odtwarzanie. Na przykład możesz użyć wzorca kreatora do utworzenia elementu 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 RemoteMediaClient.

Odbieranie aktualizacji stanu kolejki multimediów

Gdy odbiorca wczytuje element kolejki multimediów, przypisuje mu unikalny identyfikator, który będzie widoczny przez cały czas trwania sesji (i okresu aktywności kolejki). Aplikacja może poznać stan kolejki pod kątem tego, który element jest obecnie wczytywany (może nie być odtwarzany), wczytywany lub wstępnie wczytywany. Klasa MediaStatus zawiera te informacje o stanie:

  • Metoda getPreloadedItemId() – jeśli następny element został wstępnie wczytany, zwraca identyfikator tego elementu.
  • Metoda getLoadingItemId() – zwraca identyfikator elementu, który aktualnie wczytuje (ale nie jest aktywny w kolejce) w odbiorniku.
  • Metoda getCurrentItemId() – zwraca identyfikator elementu, który był aktywny w kolejce (może nie być odtwarzany) w momencie zmiany stanu multimediów.
  • getQueueItems() (Wycofana, zamiast niej użyj MediaQueue) – zwraca listę MediaQueueItem instancji w postaci listy, której nie można zmienić.

Aplikacja może też pobrać listę elementów za pomocą klasy MediaQueue. Klasa to rozproszony model danych kolejki multimediów. Na liście znajduje się lista identyfikatorów produktów w kolejce, która jest automatycznie synchronizowana z odbiornikiem. MediaQueue nie przechowuje wszystkich danych z MediaQueueItem, bo gdy kolejka jest bardzo długa, zajmuje to za dużo pamięci. Zamiast tego pobiera elementy na żądanie i zachowuje LruCache ostatnio używanych elementów. Dostęp do kolejki multimediów możesz uzyskać, korzystając z tych metod:

  • Metoda getItemIds() – zwraca listę wszystkich identyfikatorów elementów w kolejności.
  • Metoda getItemAtIndex() – zwraca element z pamięci podręcznej dla danego indeksu. Jeśli element nie jest przechowywany w pamięci podręcznej, MediaQueue zwróci null i zaplanuje jego pobieranie. Po pobraniu elementu funkcja MediaQueue.Callback#itemsUpdatedAtIndexes() zostanie wywołana. Ponowne wywołanie getItemAtIndex() z tym samym identyfikatorem zwróci element.
  • fetchMoteItemsRelativeToIndex() jest używany, gdy użytkownik przewija interfejs kolejki w górę lub w dół, a aplikacja chce pobrać więcej elementów z chmury.

Aby poinformować aplikację o stanie kolejki i jej elementach, używaj tych metod razem z innymi metodami dotyczącymi stanu multimediów. Oprócz aktualizacji stanu multimediów od odbiorcy aplikacja może nasłuchiwać zmian w kolejce, implementując metody RemoteMediaClient.Callback i MediaQueue.Callback.

Oprócz tego pakiet Cast SDK udostępnia 2 klasy narzędzia do tworzenia UI do kolejkowania.

Aby na przykład utworzyć RecyclerView za pomocą właściwości 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);
}

Edytuj kolejkę

Aby wykonywać operacje na elementach w kolejce, użyj metod kolejki klasy RemoteMediaClient. Pozwalają one wczytać tablicę elementów do nowej kolejki, wstawiać elementy do istniejącej kolejki, aktualizować właściwości elementów w kolejce, przenosić elementy w kolejce do przodu lub do tyłu, określać właściwości samej kolejki (np. zmienić algorytm repeatMode wybierający następny element), usuwać elementy z kolejki i zmieniać ich kolejność.