Implementa la API de Co-Watching

En esta página, se describe cómo usar la API de visualización en compañía para admitir una situación de visualización en compañía.

Configuración inicial

A fin de preparar la biblioteca para su uso, la aplicación de compartir en vivo debe inicializar un objeto CoWatchingClient que represente una sesión de visualización en compañía.

Para usar el SDK de Compartir en vivo de Meet, llama al método AddonClientFactory.getClient. Esto muestra un AddonClient que funciona como punto de entrada para la sesión de visualización en compañía.

Si deseas usar el cliente, llama al método newSessionBuilder desde AddonClient para mostrar un compilador para un AddonSession nuevo. El newSessionBuilder implementa la interfaz de AddonSessionHandler para controlar las devoluciones de llamada que proporciona el complemento para la sesión.

Para iniciar una sesión, agrega el método withCoWatching al compilador.

En la siguiente muestra de código, se observa una inicialización básica del objeto del cliente de visualización en compañía:

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 las acciones del usuario

Cuando el usuario local realiza acciones (por ejemplo, pausar o buscar la reproducción de contenido multimedia en su dispositivo), se debe informar a la biblioteca para que esas acciones se puedan duplicar en otros participantes en la experiencia de visualización en compañía. Para ver un ejemplo de cómo notificar a la biblioteca cuando hay varios estados, consulta Cómo comenzar.

Puedes controlar el estado de visualización en compañía con estos métodos:

  • CoWatchingClient.notifyBuffering: Notifica a Meet que el contenido multimedia no está listo para reproducirse debido al almacenamiento en búfer, debido a un cambio de contenido multimedia anterior, una búsqueda de contenido multimedia o una congestión normal de la red.
  • CoWatchingClient.notifyEnded: Notifica a Meet que el reproductor multimedia llegó al final del contenido multimedia actual.
  • CoWatchingClient.notifyPauseState Notifica a Meet que el usuario pausó o reanudó la reproducción de contenido multimedia, de modo que Meet pueda duplicar esa acción para otros usuarios.
  • CoWatchingClient.notifyPlayoutRate: Notifica a Meet que el usuario actualizó la tasa de reproducción del contenido multimedia a un valor nuevo (por ejemplo, 1.25x).
  • CoWatchingClient.notifyQueueUpdate: Notifica a Meet que la cola cambió, por lo que puede duplicarla para otros usuarios.
  • CoWatchingClient.notifyReady: Notifica a Meet que se completó el almacenamiento en búfer y que el contenido multimedia ahora está listo para reproducirse a partir de la marca de tiempo proporcionada.
  • CoWatchingClient.notifySeekToTimestamp: Notifica a Meet que el usuario buscó el punto de reproducción del contenido multimedia, por lo que Meet puede duplicar esa acción para otros usuarios.
  • CoWatchingClient.notifySwitchedToMedia: Notifica a Meet que el usuario cambió de contenido multimedia para que pueda pasárselo a otros usuarios. y una opción de actualización simultánea de la cola.

En la siguiente muestra de código, se indica cómo notificar a los usuarios:

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

Administra el estado remoto

Para aplicar actualizaciones entrantes de participantes remotos, debes ofrecer a Meet una forma de administrar directamente el estado de reproducción de contenido multimedia local con la devolución de llamada CoWatchingHandler.onCoWatchingStateChanged().

Meet también debe recuperar la posición actual de la reproducción de contenido multimedia llamando a la devolución de llamada CoWatchingHandler.onStateQuery(). Se llama a este método con regularidad, por lo que se debe escribir para que tenga un buen rendimiento (por ejemplo, <100 ms).

En la siguiente muestra de código, se observa una implementación 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));
  }
}