キュー

キャスト フレームワークには、MediaQueueItem インスタンスのリストの作成をサポートするキューイング クラスが用意されています。このリストは、動画や音声ストリームなどの MediaInfo インスタンスからビルドして、レシーバーで順次再生することができます。このコンテンツ アイテムのキューの編集、並べ替え、更新などを行うことができます。

Receiver SDK は、現在アクティブ(再生中または一時停止中)のアイテムが少なくとも 1 つある限り、キューを維持し、キューのオペレーションに応答します。送信者はセッションに参加してキューにアイテムを追加できます。レシーバは、最後のアイテムの再生を完了するか、センダーが再生を停止してセッションを終了するまで、またはセンダーがレシーバに新しいキューを読み込むまで、キューアイテムのセッションを維持します。デフォルトでは、レシーバは終了したキューに関する情報を保持しません。キュー内の最後のアイテムが終了すると、メディア セッションが終了してキューがなくなります。

メディアキュー アイテムを作成して読み込む

メディアキュー アイテムは、キャスト フレームワークで MediaQueueItem インスタンスとして表示されます。メディアキュー アイテムを作成するときに、アダプティブ コンテンツで Media Player ライブラリを使用している場合は、キュー内の先行アイテムの再生が完了する前にプレーヤーがメディアキュー アイテムのバッファリングを開始できるようにプリロード時間を設定できます。アイテムの autoplay 属性を true に設定すると、レシーバーが自動的に再生できるようになります。たとえば、次のようにビルダー パターンを使用してメディアキュー アイテムを作成できます。

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

RemoteMediaClient の適切な queueLoad メソッドを使用して、キュー内のメディアキュー アイテムの配列を読み込みます。

メディアキューのステータス更新を受け取る

レシーバは、メディアキュー アイテムを読み込むと、そのアイテムに一意の ID を割り当てます。この ID は、セッション中(およびキューの存続期間中)に保持されます。アプリは、現在読み込まれている(再生されていない可能性がある)、読み込み中、またはプリロードされているアイテムについて、キューのステータスを学習します。MediaStatus クラスは、このステータス情報を提供します。

  • getPreloadedItemId() メソッド - 次の項目がプリロードされている場合、プリロードされたアイテム ID を返します。
  • getLoadingItemId() メソッド - レシーバーで現在読み込み中である(ただし、キューではアクティブではない)アイテムのアイテム ID を返します。
  • getCurrentItemId() メソッド - メディア ステータスの変更が発生したときに、キュー内でアクティブだった(再生されていない可能性もあります)アイテムのアイテム ID を返します。
  • getQueueItems()(非推奨。代わりに MediaQueue を使用)メソッド - MediaQueueItem インスタンスのリストを変更不可能なリストとして返します。

また、アプリで MediaQueue クラスを使用してアイテムのリストを取得することもできます。このクラスは、メディアキューのスパースデータ モデルです。アイテム ID のリストをキューに保持し、レシーバと自動的に同期されます。キューが非常に長いとメモリが消費されすぎるため、MediaQueue はすべての MediaQueueItem を保持しません。アイテムをオンデマンドでフェッチし、最近アクセスされたアイテムの LruCache を保持します。メディアキューにアクセスするには、次のメソッドを使用します。

  • getItemIds() メソッド - すべてのアイテム ID のリストを順番に返します。
  • getItemAtIndex() メソッド - 指定されたインデックスでキャッシュに保存されたアイテムを返します。アイテムがキャッシュに保存されていない場合、MediaQueuenull を返し、アイテムの取得をスケジュールします。アイテムが取得されると、MediaQueue.Callback#itemsUpdatedAtIndexes() が呼び出され、同じ ID で getItemAtIndex() を再度呼び出すとアイテムが返されます。
  • fetchMoteItemsRelativeToIndex() は、ユーザーがキュー UI を一番上または一番下までスクロールしたときに、アプリがクラウドからさらに多くのアイテムを取得する必要がある場合に使用します。

これらのメソッドを他のメディア ステータス メソッドと一緒に使用して、キューのステータスとキュー内のアイテムについてアプリに通知します。レシーバからのメディア ステータスの更新に加えて、アプリは RemoteMediaClient.CallbackMediaQueue.Callback を実装して、キューに対する変更をリッスンできます。

また、Cast SDK には、キューイング用の UI を作成するための 2 つのユーティリティ クラスが用意されています。

たとえば、MediaQueueRecyclerViewAdapter を使用して RecyclerView を作成するには、次のようにします。

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

キューを編集する

キュー内のアイテムを操作するには、RemoteMediaClient クラスのキュー メソッドを使用します。これらを使用すると、アイテムの配列の新しいキューへの読み込み、既存のキューへのアイテムの挿入、キュー内のアイテムのプロパティの更新、キュー内でアイテムを前後に移動させる、キュー自体のプロパティを設定する(たとえば、次のアイテムを選択する repeatMode アルゴリズムを変更する)、キューからアイテムを削除する、キュー内のアイテムを並べ替えることができます。