Implementare l'API Co-Watching

In questa pagina viene descritto come utilizzare l'API Co-Watching per supportare uno scenario di visualizzazione condivisa.

Configurazione iniziale

Per preparare la libreria all'uso, l'applicazione di condivisione in tempo reale deve inizializzare un oggetto CoWatchingClient che rappresenta una sessione di visualizzazione condivisa.

Per utilizzare l'SDK di condivisione in tempo reale di Meet, chiama il metodo AddonClientFactory.getClient. Questo restituisce un elemento AddonClient che funge da punto di accesso per la sessione di visualizzazione condivisa.

Per utilizzare il client, chiama il metodo newSessionBuilder da AddonClient per restituire un builder per una nuova AddonSession. newSessionBuilder implementa l'interfaccia AddonSessionHandler per gestire i callback forniti dal componente aggiuntivo per la sessione.

Per avviare una sessione, aggiungi il metodo withCoWatching allo strumento di creazione.

Il seguente esempio di codice mostra un'inizializzazione di base dell'oggetto client di visualizzazione condivisa:

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

Invia notifiche per le azioni degli utenti

Quando l'utente locale esegue delle azioni, ad esempio mettendo in pausa o ricercando la riproduzione multimediale sul proprio dispositivo, la raccolta deve essere informata in modo che le azioni possano essere visualizzate ad altri partecipanti all'esperienza di visione condivisa. Per un esempio di come inviare notifiche alla libreria per più stati, consulta la Guida introduttiva.

Puoi controllare lo stato di visualizzazione condivisa utilizzando questi metodi:

  • CoWatchingClient.notifyBuffering: informa Meet che i contenuti multimediali non sono pronti per essere riprodotti a causa del buffering, a causa di un precedente cambio di contenuti, della ricerca di contenuti multimediali o della normale congestione di rete.
  • CoWatchingClient.notifyEnded: comunica a Meet che il media player ha raggiunto la fine dei contenuti multimediali correnti.
  • CoWatchingClient.notifyPauseState Comunica a Meet che l'utente ha messo in pausa o riattivato la riproduzione dei contenuti multimediali, in modo che Meet possa rispecchiare l'azione per altri utenti.
  • CoWatchingClient.notifyPlayoutRate: informa Meet che l'utente ha aggiornato la percentuale di riproduzione dei contenuti multimediali impostandola su un nuovo valore (ad esempio, 1,25x).
  • CoWatchingClient.notifyQueueUpdate: comunica a Meet che la coda è stata modificata, in modo che Meet possa eseguirne il mirroring per altri utenti.
  • CoWatchingClient.notifyReady: informa Meet che il buffering è stato completato e che i contenuti multimediali sono ora pronti per essere riprodotti, a partire dal timestamp fornito.
  • CoWatchingClient.notifySeekToTimestamp: comunica a Meet che l'utente ha cercato il punto di riproduzione dei contenuti multimediali, in modo che Meet possa rispecchiare l'azione per altri utenti.
  • CoWatchingClient.notifySwitchedToMedia: informa Meet che l'utente ha cambiato contenuti multimediali, in modo che Meet possa trasmetterlo ad altri utenti. Offre anche un'opzione per l'aggiornamento simultaneo della coda.

Il seguente esempio di codice mostra come inviare una notifica agli utenti:

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

Gestisci stato remoto

Per applicare gli aggiornamenti in arrivo dai partecipanti da remoto, devi offrire a Meet un modo per gestire direttamente lo stato di playout dei contenuti multimediali locali utilizzando il callback di CoWatchingHandler.onCoWatchingStateChanged().

Meet deve anche recuperare la posizione attuale della riproduzione multimediale chiamando il callback di CoWatchingHandler.onStateQuery(). Questa operazione viene chiamata regolarmente, quindi dovrebbe essere scritta per offrire prestazioni migliori (ad esempio, <100 ms).

Il seguente esempio di codice mostra un'implementazione di 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));
  }
}