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 ese tipo de situación.

Configuración inicial

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

Si quieres usar el SDK de Meet para compartir en vivo, llama al método AddonClientFactory.getClient. Se mostrará un AddonClient que sirve como punto de entrada para la sesión de visualización en compañía.

Para usar el cliente, llama al método newSessionBuilder desde AddonClient a fin de mostrar un compilador para una AddonSession nueva. 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 muestra una inicialización básica del objeto de 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 el contenido multimedia que se reproduce en su dispositivo), se debe informar a la biblioteca para que esas acciones puedan duplicarse en la experiencia de visualización en compañía. Para ver un ejemplo de cómo notificar a la biblioteca sobre varios estados, consulta Cómo comenzar.

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

  • CoWatchingClient.notifyBuffering: Notifica a Meet que el contenido multimedia no está listo para reproducirse debido al almacenamiento en búfer, a un cambio previo de contenido multimedia, 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 frecuencia de reproducción del contenido multimedia a un valor nuevo (por ejemplo, 1.25x).
  • CoWatchingClient.notifyQueueUpdate: Notifica a Meet que cambió la cola, por lo que Meet puede duplicarlo 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, por lo que este puede pasarlo a otros usuarios. También tiene 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);
};

Cómo administrar el estado remoto

Para aplicar las actualizaciones entrantes de los 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 multimedia llamando a la devolución de llamada CoWatchingHandler.onStateQuery(). Se llama 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 incluye 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));
  }
}