Implementar a API de co-watching

Nesta página, descrevemos como usar a API Co-Watching para oferecer suporte a um cenário de assistir em grupo.

Configuração inicial

Para preparar a biblioteca para uso, o aplicativo de compartilhamento ao vivo precisa inicializar um objeto CoWatchingClient que representa uma sessão de assistir em grupo.

Para usar o SDK de compartilhamento ao vivo do Meet, chame o método AddonClientFactory.getClient. Isso retorna um AddonClient que serve como ponto de entrada para a sessão de assistir em grupo.

Para usar o cliente, chame o método newSessionBuilder do AddonClient para retornar um builder para um novo AddonSession. O newSessionBuilder implementa a interface AddonSessionHandler para processar os callbacks fornecidos pelo complemento para a sessão.

Para iniciar uma sessão, adicione o método withCoWatching ao builder.

O exemplo de código a seguir mostra uma inicialização básica do objeto do cliente assistindo em grupo:

Java

class AwesomeVideoAddonSessionHandler implements AddonSessionHandler {}

// For sample implementation, see the "Manage remote state" section below.
class AwesomeVideoCoWatchingHandler implements CoWatchingHandler {}

public ListenableFuture<AddonSession> initialSetup() {
  AddonClient meetClient = AddonClientFactory.getClient();
  return meetClient
      .newSessionBuilder(
          new AwesomeVideoAddonSessionHandler())
      .withCoWatching(new AwesomeVideoCoWatchingHandler())
      .begin();
}

Notificar sobre ações do usuário

Quando o usuário local realiza ações, como pausar ou buscar o layout de mídia no dispositivo, a biblioteca precisa ser informada para que essas ações possam ser espelhadas para outros participantes na experiência de assistir em grupo. Para conferir um exemplo de como notificar a biblioteca sobre vários estados, consulte Começar.

É possível controlar o estado de assistir em grupo usando os seguintes métodos:

  • CoWatchingClient.notifyBuffering: notifica ao Meet que a mídia não está pronta para ser reproduzida devido ao armazenamento em buffer, devido a uma troca de mídia, busca de mídia ou congestionamento normal de rede.
  • CoWatchingClient.notifyEnded: notifica ao Meet que o player de mídia chegou ao fim da mídia atual.
  • CoWatchingClient.notifyPauseState Informar ao Meet que o usuário pausou ou retomou a reprodução de mídia para que o Meet possa espelhar essa ação para outros usuários.
  • CoWatchingClient.notifyPlayoutRate: notifica ao Meet que o usuário atualizou a taxa de exibição da mídia para um novo valor (por exemplo, 1,25x).
  • CoWatchingClient.notifyQueueUpdate: informa ao Meet que a fila mudou para refletir isso para outros usuários.
  • CoWatchingClient.notifyReady: notifica ao Meet que o armazenamento em buffer foi concluído e a mídia está pronta para ser reproduzida, começando no carimbo de data/hora fornecido.
  • CoWatchingClient.notifySeekToTimestamp: notifica ao Meet que o usuário procurou o ponto de reprodução da mídia. Assim, o Meet pode espelhar essa ação para outros usuários.
  • CoWatchingClient.notifySwitchedToMedia: notifica ao Meet que o usuário trocou de mídia, para que o Meet possa transmitir essa informação a outros usuários. Também tem uma opção para atualização de fila simultânea.

O exemplo de código a seguir mostra como notificar os usuários:

Java

public void onVideoPaused(Duration currentTimestamp) {
  // Use Meet to broadcast the pause state to ensure other participants also pause.
  this.session.getCoWatching().notifyPauseState(/* paused= */ true, currentTimestamp);
};

Gerenciar estado remoto

Para aplicar as atualizações recebidas de participantes remotos, você precisa oferecer ao Meet uma maneira de gerenciar diretamente o estado de reprodução de mídia local usando o callback CoWatchingHandler.onCoWatchingStateChanged().

O Meet também precisa extrair a posição atual do layout da mídia chamando o callback CoWatchingHandler.onStateQuery(). Isso é chamado regularmente. Portanto, ele precisa ser gravado para ter um bom desempenho (por exemplo, <100 ms).

O exemplo de código abaixo mostra uma implementação do CoWatchingHandler:

Java

class AwesomeVideoCoWatchingHandler implements CoWatchingHandler {
  /** Applies incoming playback state to the local video. */
  public void onCoWatchingStateChanged(CoWatchingState newState) {
    // Handle transition to new video.
    if (!newState.mediaId().equals(this.videoPlayer.videoUrl)) {
      this.videoPlayer.loadVideo(newState.mediaId());
    }

    // Only adjust the local video playout if it's sufficiently diverged from the timestamp in the
    // applied update.
    if (newState
            .mediaPlayoutPosition()
            .minus(this.videoPlayer.videoTimestamp)
            .compareTo(Duration.ofMillis(500))
        > 0) {
      this.videoPlayer.seek(newState.mediaPlayoutPosition());
    }

    // Update pause state, if necessary.
    if (newState.playbackState().equals(PLAY) && this.videoPlayer.isPaused) {
      this.videoPlayer.unpause();
    } else if (newState.playbackState().equals(PAUSE) && !this.videoPlayer.isPaused) {
      this.videoPlayer.pause();
    }
  }

  /** Returns local video playback state. */
  public Optional<QueriedCoWatchingState> onStateQuery() {
    return Optional.of(QueriedCoWatchingState.of(
      /* mediaPlayoutPosition= */ this.videoPlayer.videoTimestamp));
  }
}