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 Condivisione in tempo reale di Meet, chiama il metodo AddonClientFactory.getClient. In questo modo viene restituito un elemento AddonClient che funge da punto di ingresso per la sessione di visualizzazione condivisa.

Per utilizzare il client, chiama il metodo newSessionBuilder da AddonClient per restituire uno strumento per la creazione di un nuovo AddonSession. newSessionBuilder implementa l'interfaccia AddonSessionHandler per gestire i callback forniti dal componente aggiuntivo per la sessione.

Per iniziare una sessione, aggiungi il metodo withCoWatching al builder.

Il seguente esempio di codice mostra un'inizializzazione di base dell'oggetto client che guarda contemporaneamente:

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

Notifica azioni degli utenti

Quando l'utente locale esegue azioni, ad esempio mettendo in pausa o cercando la riproduzione multimediale sul dispositivo, è necessario informare la raccolta in modo che tali azioni possano essere sincronizzate con altri partecipanti nell'esperienza di visualizzazione condivisa. Per un esempio di come inviare una notifica alla libreria per più stati, consulta la Guida introduttiva.

Puoi controllare lo stato della visione condivisa utilizzando questi metodi:

  • CoWatchingClient.notifyBuffering: nota a Meet che i contenuti multimediali non sono pronti per essere riprodotti a causa del buffering, di un cambio multimediale precedente, di una ricerca multimediale o della normale congestione della rete.
  • CoWatchingClient.notifyEnded: informa Meet che il media player ha raggiunto la fine dei contenuti multimediali attuali.
  • CoWatchingClient.notifyPauseState Comunica a Meet che l'utente ha messo in pausa o riattivato la riproduzione di contenuti multimediali, in modo che Meet possa eseguire il mirroring dell'azione per altri utenti.
  • CoWatchingClient.notifyPlayoutRate: informa Meet che l'utente ha aggiornato la percentuale di riproduzione dei contenuti multimediali impostando un nuovo valore (ad esempio, 1,25x).
  • CoWatchingClient.notifyQueueUpdate: informa Meet che la coda è cambiata, in modo 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: informa Meet che l'utente ha cercato il punto di riproduzione dei contenuti multimediali, in modo che Meet possa eseguire il mirroring dell'azione per altri utenti.
  • CoWatchingClient.notifySwitchedToMedia: informa Meet che l'utente ha cambiato contenuto multimediale, in modo Meet possa inoltrarli ad altri utenti. C'è anche un'opzione per l'aggiornamento simultaneo della coda.

Il seguente esempio di codice mostra come inviare notifiche 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 remoti, devi offrire a Meet un modo per gestire direttamente lo stato di riproduzione dei contenuti multimediali locali utilizzando la callback di CoWatchingHandler.onCoWatchingStateChanged().

Meet deve anche recuperare la posizione attuale della riproduzione multimediale chiamando il callback di CoWatchingHandler.onStateQuery(). Viene chiamata regolarmente, pertanto deve essere scritta per garantire prestazioni elevate (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));
  }
}