Implementar a API de co-watching

Esta página descreve como usar a API Co-Watching para dar suporte a uma para assistir em grupo.

Configuração inicial

Para preparar a biblioteca para uso, o aplicativo de compartilhamento ao vivo precisa inicializar um CoWatchingClient objeto 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 uma 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 uma nova AddonSession O newSessionBuilder implementa o AddonSessionHandler para lidar com os retornos de chamada fornecidos pelo para a sessão.

Para iniciar uma sessão, adicione o withCoWatching no builder.

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

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 a mídia no dispositivo. A biblioteca deve ser informada para que essas ações possam ser para outros participantes da experiência de assistir em grupo. Para um exemplo de como notificar a biblioteca para vários estados, consulte Receber iniciado.

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 a até o armazenamento em buffer, devido a uma mudança de mídia anterior, busca de mídia ou tráfego congestionamento.
  • CoWatchingClient.notifyEnded Notifica o Meet de que o player de mídia chegou ao fim a 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 o Meet que o usuário atualizou a taxa de reprodução de a mídia para um novo valor (por exemplo, 1,25x).
  • CoWatchingClient.notifyQueueUpdate Notifica o Meet de que a fila foi alterada. Assim, O Meet pode espelhar essa informação para os outros usuários.
  • CoWatchingClient.notifyReady Notifica o Meet de que o armazenamento em buffer foi concluído e a mídia foi está pronto para ser reproduzido, começando no carimbo de data/hora fornecido.
  • CoWatchingClient.notifySeekToTimestamp Notifica o Meet que o usuário buscou o ponto de reprodução de a mídia, para que o Meet espelhe essa ação para outros usuários.
  • CoWatchingClient.notifySwitchedToMedia Notifica o Meet de que o usuário trocou de mídia. Por isso, O Meet pode repassar essas informações para outros usuários. Também tem uma opção para atualização simultânea da fila.

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 Conheça uma forma de gerenciar diretamente o estado de transmissão da mídia local usando as CoWatchingHandler.onCoWatchingStateChanged() o retorno de chamada.

O Meet também precisa recuperar a posição atual da mídia de repente chamando CoWatchingHandler.onStateQuery() o retorno de chamada. Ele é chamado regularmente, por isso precisa ser escrito para ter um bom desempenho. (por exemplo, <100ms).

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