Implémenter l'API de co-visionnage

Cette page explique comment utiliser l'API Co-Watching dans 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 de partage en direct Meet, appelez la méthode AddonClientFactory.getClient. Cette action renvoie un AddonClient qui servira de point d'entrée pour 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 des notifications en cas d'actions des utilisateurs

Lorsque l'utilisateur local effectue des actions (par exemple, mettre en pause ou rechercher la lecture d'un contenu multimédia sur son appareil), la bibliothèque doit en être informée afin que ces actions puissent être dupliquées pour les autres participants à l'expérience de visionnage à plusieurs. Pour obtenir un exemple d'envoi d'une notification à la bibliothèque pour plusieurs états, consultez la section 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 lu en raison d'une mise en mémoire tampon (en raison d'un contact multimédia précédent, 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 en cours.
  • CoWatchingClient.notifyPauseState Informez Meet que l'utilisateur a interrompu ou réactivé la lecture des contenus multimédias afin que Meet puisse dupliquer cette action pour les autres utilisateurs.
  • CoWatchingClient.notifyPlayoutRate : informe Meet que l'utilisateur a remplacé le taux de lecture du contenu multimédia par une nouvelle valeur (par exemple, 1,25x).
  • CoWatchingClient.notifyQueueUpdate : informe Meet que la file d'attente a été modifiée afin que Meet puisse dupliquer cela 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 aux autres utilisateurs. Il offre également une option de mise à jour simultanée de la file d'attente.

L'exemple de code suivant montre comment avertir 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 de lecture du contenu multimédia local à l'aide du rappel CoWatchingHandler.onCoWatchingStateChanged().

Meet doit également récupérer la position actuelle de la lecture multimédia en appelant le rappel CoWatchingHandler.onStateQuery(). Cette méthode 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));
  }
}