Implémenter l'API de co-visionnage

Cette page explique comment utiliser l'API de covisionnage pour prendre en charge un scénario de visionnage à plusieurs.

Configuration initiale

Pour préparer la bibliothèque à utiliser, l'application de partage en direct doit initialiser un objet CoWatchingClient qui représente une session de visionnage à plusieurs.

Pour utiliser le SDK Meet Live Sharing, appelez la méthode AddonClientFactory.getClient. Cela renvoie un AddonClient qui sert de point d'entrée à la session de visionnage à plusieurs.

Pour utiliser le client, appelez la méthode newSessionBuilder à partir de AddonClient afin de renvoyer un compilateur pour un nouveau AddonSession. newSessionBuilder implémente l'interface AddonSessionHandler pour gérer les rappels fournis par le module complémentaire pour la session.

Pour démarrer une session, ajoutez la méthode withCoWatching au compilateur.

L'exemple de code suivant montre une initialisation de base de l'objet client de visionnage à plusieurs:

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

Envoyer une notification en cas d'action de l'utilisateur

Lorsque l'utilisateur local effectue des actions (par exemple, mettre en pause ou rechercher la lecture multimédia sur son appareil), la bibliothèque doit être informée pour que ces actions puissent être mises en miroir auprès des autres participants dans l'expérience de visionnage à plusieurs. Pour obtenir un exemple expliquant comment notifier la bibliothèque pour plusieurs états, consultez Premiers pas.

Vous pouvez contrôler l'état de visionnage à plusieurs à l'aide des méthodes suivantes:

  • CoWatchingClient.notifyBuffering : informe Meet que le contenu multimédia n'est pas prêt à être diffusé en raison d'une mise en mémoire tampon en raison d'un commutateur multimédia antérieur, d'une recherche multimédia ou d'une congestion normale du réseau.
  • CoWatchingClient.notifyEnded : informe Meet que le lecteur multimédia a atteint la fin du contenu multimédia actuel.
  • CoWatchingClient.notifyPauseState Informez Meet que l'utilisateur a mis en pause ou réactivé la lecture d'un contenu multimédia afin que Meet puisse dupliquer cette action pour les autres utilisateurs.
  • CoWatchingClient.notifyPlayoutRate : informe Meet que l'utilisateur a mis à jour le taux de lecture du contenu multimédia vers une nouvelle valeur (par exemple, x1,25).
  • CoWatchingClient.notifyQueueUpdate : informe Meet que la file d'attente a changé, afin que Meet puisse le mettre en miroir pour les autres utilisateurs.
  • CoWatchingClient.notifyReady : informe Meet que la mise en mémoire tampon est terminée et que le contenu multimédia est maintenant prêt à être lu, à partir du code temporel fourni.
  • CoWatchingClient.notifySeekToTimestamp : informe Meet que l'utilisateur a recherché le point de lecture du contenu multimédia afin que Meet puisse dupliquer cette action pour les autres utilisateurs.
  • CoWatchingClient.notifySwitchedToMedia : informe Meet que l'utilisateur a changé de contenu multimédia afin que Meet puisse le transmettre à d'autres utilisateurs. Il offre également une option de mise à jour simultanée de la file d'attente.

L'exemple de code suivant montre comment informer les utilisateurs:

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

Gérer l'état distant

Pour appliquer les mises à jour entrantes des participants distants, vous devez proposer à Meet un moyen de gérer directement l'état du lecteur multimédia local à l'aide du rappel CoWatchingHandler.onCoWatchingStateChanged().

Meet doit également récupérer la position actuelle de la diffusion multimédia en appelant le rappel CoWatchingHandler.onStateQuery(). Cette opération est appelée régulièrement. Elle doit donc être écrite pour être performante (par exemple, < 100 ms).

L'exemple de code suivant montre une implémentation 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));
  }
}