Enfileiramento

O framework Cast oferece classes de enfileiramento que aceitam a criação de listas de MediaQueueItem instâncias, que podem ser criadas com instâncias de MediaInfo, como streams de vídeo ou áudio , para serem reproduzidas sequencialmente no receptor. Essa fila de itens de conteúdo pode ser editada, reordenada, atualizada e assim por diante.

O SDK do receptor mantém a fila e responde às operações nela enquanto houver pelo menos um item ativo (em reprodução ou pausado). Os remetentes podem participar da sessão e adicionar itens à fila. O receptor mantém uma sessão para itens de fila até que o último item termine a reprodução ou o remetente a interrompa e encerre a sessão, ou até que um remetente carregue uma nova fila no receptor. Por padrão, o receptor não mantém nenhuma informação sobre filas encerradas. Quando o último item da fila termina, a sessão de mídia é encerrada e a fila desaparece.

Criar e carregar itens de fila de mídia

Um item de fila de mídia é representado no framework Cast como uma MediaQueueItem instância. Ao criar um item de fila de mídia, se você estiver usando a Biblioteca do Player de Mídia com conteúdo adaptável, poderá definir o tempo de pré-carregamento para que o player possa começar a armazenar em buffer o item de fila de mídia antes que o item à frente dele na fila termine a reprodução. Definir o atributo de reprodução automática do item como verdadeiro permite que o receptor o reproduza automaticamente. Por exemplo, você pode usar um padrão de builder para criar o item de fila de mídia da seguinte maneira:

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

Carregue uma matriz de itens de fila de mídia na fila usando o método apropriado queueLoad de RemoteMediaClient.

Receber atualizações de status da fila de mídia

Quando o receptor carrega um item de fila de mídia, ele atribui um ID exclusivo ao item que persiste durante a sessão (e a vida útil da fila). Seu app pode aprender o status da fila em termos de qual item está carregado no momento (talvez não esteja sendo reproduzido), carregando ou pré-carregado. A classe MediaStatus fornece essas informações de status:

  • getPreloadedItemId() método: se o próximo item tiver sido pré-carregado, retorna o ID do item pré-carregado.
  • getLoadingItemId() método: retorna o ID do item que está sendo carregado no momento (mas não está ativo na fila) no receptor.
  • getCurrentItemId() método: retorna o ID do item que estava ativo na fila (talvez não esteja sendo reproduzido) no momento em que a mudança de status da mídia ocorreu.
  • getQueueItems() (Descontinuado, use MediaQueue em vez disso) método - Retorna a lista de MediaQueueItem instâncias como uma lista não modificável.

Seu app também pode receber a lista de itens usando a MediaQueue classe. A classe é um modelo de dados esparso da fila de mídia. Ela mantém a lista de IDs de itens na fila, que é sincronizada automaticamente com o receptor. MediaQueue não mantém todos os MediaQueueItem porque isso ocupa muita memória quando a fila é muito longa. Em vez disso, ele busca os itens sob demanda e mantém um LruCache de itens acessados recentemente. Você pode usar esses métodos para acessar a fila de mídia:

  • getItemIds() método: retorna a lista de todos os IDs de itens em ordem.
  • getItemAtIndex() método: retorna o item armazenado em cache em um determinado índice. Se o item não estiver armazenado em cache, MediaQueue vai retornar null e agendar a busca do item. Quando o item for buscado, MediaQueue.Callback#itemsUpdatedAtIndexes() será chamado, e chamar getItemAtIndex() com o mesmo ID novamente vai retornar o item.
  • fetchMoteItemsRelativeToIndex() é usado quando o usuário rola a interface da fila para cima ou para baixo, e o app quer buscar mais itens na nuvem.

Use esses métodos com os outros métodos de status de mídia para informar seu app sobre o status da fila e os itens nela. Além das atualizações de status de mídia do receptor, seu app pode detectar mudanças na fila implementando RemoteMediaClient.Callback e MediaQueue.Callback.

Além disso, o SDK do Cast oferece duas classes de utilitários para criar a interface de enfileiramento.

Por exemplo, para criar um RecyclerView usando 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);
}

Editar a fila

Para operar nos itens da fila, use os métodos de fila da RemoteMediaClient classe. Eles permitem carregar uma matriz de itens em uma nova fila, inserir itens em uma fila atual, atualizar as propriedades dos itens na fila, fazer um item avançar ou retroceder na fila, definir as propriedades da fila em si (por exemplo, mudar o algoritmo repeatMode que seleciona o próximo item), remover itens da fila e reordenar os itens na fila.