Implementa la API de Co-Watching

Esta página describe cómo usar la API de Co-Watching para admitir un situación de visualización en compañía.

Configuración inicial

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

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

Para usar el cliente, llama al newSessionBuilder método de AddonClient para mostrar un compilador para un nuevo AddonSession newSessionBuilder implementa AddonSessionHandler para administrar las devoluciones de llamada que proporciona el para la sesión.

Para iniciar una sesión, agrega withCoWatching en el compilador.

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

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, detener o buscar contenido multimedia en su dispositivo, se debe informar a la biblioteca para que se puedan se refleja en los demás participantes de la experiencia de visualización en compañía. Por ejemplo cómo notificar a la biblioteca para varios estados, consulta Obtener 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 a al almacenamiento en búfer, debido a un cambio de contenido multimedia previo, una búsqueda de contenido multimedia o una conexión de red normal la congestión.
  • CoWatchingClient.notifyEnded Notifica a Meet que el reproductor multimedia llegó al final de el contenido multimedia actual.
  • CoWatchingClient.notifyPauseState Notificar a Meet que el usuario pausó o reanudó la reproducción de contenido multimedia, para que Meet pueda replicar esa acción para otros usuarios.
  • CoWatchingClient.notifyPlayoutRate Notifica a Meet que el usuario actualizó la tasa de reproducción de el elemento multimedia a un valor nuevo (por ejemplo, 1.25x).
  • CoWatchingClient.notifyQueueUpdate Notifica a Meet que la fila cambió, por lo que Meet puede replicar eso para otros usuarios.
  • CoWatchingClient.notifyReady Notifica a Meet que se completó el almacenamiento en búfer y que el contenido multimedia está Ya 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 de y el contenido multimedia, para que Meet pueda replicar esa acción para otros usuarios.
  • CoWatchingClient.notifySwitchedToMedia Notifica a Meet que el usuario cambió de contenido multimedia, por lo que Meet puede pasárselo a otros usuarios. También tiene una opción para la 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 las actualizaciones entrantes de los participantes remotos, debes ofrecer Descubre una forma de administrar directamente el estado de la reproducción de contenido multimedia local usando el CoWatchingHandler.onCoWatchingStateChanged() devolución de llamada.

Meet también necesita recuperar la posición actual del contenido multimedia el juego llamando al CoWatchingHandler.onStateQuery() devolución de llamada. 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 presenta una implementación del 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));
  }
}