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 de cliente "Assistir 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 para vários estados, consulte Começar.

Use estes métodos para controlar o estado "Assistir em grupo":

  • CoWatchingClient.notifyBuffering: notifica o Meet de que a mídia não está pronta para ser reproduzida devido ao armazenamento em buffer, à troca de mídia anterior, busca de mídia ou congestionamento normal da rede.
  • CoWatchingClient.notifyEnded: notifica o Meet de que o player de mídia chegou ao fim da mídia atual.
  • CoWatchingClient.notifyPauseState Notifica o Meet de que o usuário pausou ou retomou a reprodução de mídia para que ele possa espelhar essa ação para outros usuários.
  • CoWatchingClient.notifyPlayoutRate: notifica o Meet que o usuário atualizou a taxa de reprodução da mídia para um novo valor (por exemplo, 1,25x).
  • CoWatchingClient.notifyQueueUpdate: notifica o Meet que a fila foi alterada para que o Meet possa espelhar essa informação para outros usuários.
  • CoWatchingClient.notifyReady: notifica o Meet de 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 o Meet que o usuário buscou o ponto de reprodução da mídia para que o Meet possa espelhar essa ação para outros usuários.
  • CoWatchingClient.notifySwitchedToMedia: notifica o Meet que o usuário alternou a mídia, para que o Meet possa transmitir isso a outros usuários. Também tem uma opção para atualização simultânea de filas.

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, é necessário oferecer ao Meet uma maneira de gerenciar diretamente o estado de reprodução da mídia local usando o callback CoWatchingHandler.onCoWatchingStateChanged().

O Meet também precisa recuperar a posição atual do layout de mídia chamando o callback CoWatchingHandler.onStateQuery(). Como ele é chamado regularmente, ele precisa ser escrito para ter um bom desempenho (por exemplo, menos de 100 ms).

O exemplo de código abaixo mostra uma implementação de 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));
  }
}