Warteschlange

Das Cast-Framework bietet Warteschlangenklassen, die das Erstellen von Listen von MediaQueueItem-Instanzen unterstützen. Diese können aus MediaInfo-Instanzen wie Video- oder Audiostreams erstellt werden, um sie nacheinander auf dem Empfänger abzuspielen. Diese Warteschlange mit Inhaltselementen kann bearbeitet, neu angeordnet, aktualisiert usw. werden.

Das Receiver SDK verwaltet die Warteschlange und reagiert auf Vorgänge in der Warteschlange, solange mindestens ein Element in der Warteschlange aktiv ist (wiedergegeben oder pausiert). Absender können der Sitzung beitreten und der Warteschlange Elemente hinzufügen. Der Empfänger hält eine Sitzung für Warteschlangenelemente aufrecht, bis die Wiedergabe des letzten Elements abgeschlossen ist, der Absender die Wiedergabe stoppt und die Sitzung beendet oder ein Absender eine neue Warteschlange auf dem Empfänger lädt. Der Empfänger speichert standardmäßig keine Informationen zu beendeten Warteschlangen. Sobald das letzte Element in der Warteschlange fertig ist, endet die Mediensitzung und die Warteschlange verschwindet.

Elemente der Medienwarteschlange erstellen und laden

Ein Element in der Medienwarteschlange wird im Cast-Framework als Instanz von MediaQueueItem dargestellt. Wenn du ein Medienelement in der Wiedergabeliste erstellst und die Media Player Library mit adaptiven Inhalten verwendest, kannst du die Vorab-Ladezeit so festlegen, dass der Player mit dem Puffern des Medienelements in der Wiedergabeliste beginnen kann, bevor das Element davor in der Wiedergabeliste fertig wiedergegeben ist. Wenn du das Autoplay-Attribut des Artikels auf „True“ setzt, kann der Empfänger ihn automatisch abspielen. Du kannst beispielsweise ein Builder-Muster verwenden, um ein Medienwarteschlangenelement so zu erstellen:

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();

Lade ein Array von Medienwarteschlangenelementen in die Warteschlange, indem du die entsprechende queueLoad-Methode von RemoteMediaClient verwendest.

Statusaktualisierungen für die Medienwarteschlange erhalten

Wenn der Empfänger ein Element aus der Medienwarteschlange lädt, weist er ihm eine eindeutige ID zu, die für die Dauer der Sitzung (und die Lebensdauer der Warteschlange) gültig ist. Deine App kann den Status der Wiedergabeliste abrufen, um zu erfahren, welches Element gerade geladen wird (wird möglicherweise nicht wiedergegeben), geladen wird oder vorab geladen wurde. Die Klasse MediaStatus enthält folgende Statusinformationen:

  • getPreloadedItemId() method: Wenn der nächste Artikel vorab geladen wurde, wird die ID des vorab geladenen Artikels zurückgegeben.
  • getLoadingItemId()-Methode: Gibt die Artikel-ID des Artikels zurück, der gerade auf dem Empfänger geladen wird (aber nicht aktiv in der Warteschlange ist).
  • getCurrentItemId()-Methode: Gibt die Artikel-ID des Artikels zurück, der zum Zeitpunkt der Änderung des Medienstatus in der Wiedergabeliste aktiv war (er wird möglicherweise nicht wiedergegeben).
  • getQueueItems()-Methode (Verworfen, stattdessen MediaQueue verwenden): Gibt die Liste der MediaQueueItem-Instanzen als nicht bearbeitbare Liste zurück.

Die Liste der Elemente kann auch über die Klasse MediaQueue abgerufen werden. Die Klasse ist ein spärliches Datenmodell der Medienwarteschlange. Die Liste der Artikel-IDs wird in der Warteschlange aufbewahrt und automatisch mit dem Empfänger synchronisiert. MediaQueue speichert nicht alle MediaQueueItem, da dies zu viel Arbeitsspeicher verbrauchen würde, wenn die Warteschlange sehr lang ist. Stattdessen werden die Elemente auf Anfrage abgerufen und eine LruCache der zuletzt aufgerufenen Elemente wird aufbewahrt. So kannst du auf die Medienwarteschlange zugreifen:

  • getItemIds() Methode: Gibt die Liste aller Artikel-IDs in der richtigen Reihenfolge zurück.
  • getItemAtIndex()-Methode: Gibt das im Cache gespeicherte Element an einem bestimmten Index zurück. Wenn der Artikel nicht im Cache ist, gibt MediaQueue null zurück und plant den Abruf des Artikels. Beim Abrufen des Artikels wird MediaQueue.Callback#itemsUpdatedAtIndexes() aufgerufen. Wenn getItemAtIndex() noch einmal mit derselben ID aufgerufen wird, wird der Artikel zurückgegeben.
  • fetchMoteItemsRelativeToIndex() wird verwendet, wenn der Nutzer die Warteschlangen-UI nach oben oder unten scrollt und deine App weitere Elemente aus der Cloud abrufen möchte.

Verwende diese Methoden zusammen mit den anderen Methoden für den Medienstatus, um deine App über den Status der Wiedergabeliste und der Elemente in der Wiedergabeliste zu informieren. Zusätzlich zu den Medienstatusaktualisierungen vom Empfänger kann deine App auf Änderungen an der Wiedergabeliste warten, indem du RemoteMediaClient.Callback und MediaQueue.Callback implementierst.

Außerdem bietet das Cast SDK zwei Dienstprogrammklassen zum Erstellen einer Benutzeroberfläche für die Wiedergabeliste.

So erstellen Sie beispielsweise eine RecyclerView mit 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);
}

Warteschlange bearbeiten

Verwenden Sie die Warteschlangenmethoden der Klasse RemoteMediaClient, um die Elemente in der Warteschlange zu bearbeiten. Damit kannst du ein Array von Elementen in eine neue Warteschlange laden, Elemente in eine vorhandene Warteschlange einfügen, die Eigenschaften von Elementen in der Warteschlange aktualisieren, ein Element in der Warteschlange vor- oder zurückspringen lassen, die Eigenschaften der Warteschlange selbst festlegen (z. B. den repeatMode-Algorithmus ändern, der das nächste Element auswählt), Elemente aus der Warteschlange entfernen und die Elemente in der Warteschlange neu anordnen.