Внедрение API совместного просмотра

На этой странице описывается, как использовать API совместного просмотра для поддержки сценария совместного просмотра.

Начальная настройка

Чтобы подготовить библиотеку к использованию, приложение для совместного просмотра в реальном времени должно инициализировать объект CoWatchingClient , который представляет сеанс совместного просмотра.

Чтобы использовать SDK Meet Live Sharing, вызовите метод AddonClientFactory.getClient . Это возвращает AddonClient , который служит точкой входа для сеанса совместного просмотра.

Чтобы использовать клиент, вызовите метод newSessionBuilder из AddonClient , чтобы вернуть построитель для нового AddonSession . newSessionBuilder реализует интерфейс AddonSessionHandler для обработки обратных вызовов, предоставляемых надстройкой для сеанса.

Чтобы начать сеанс, добавьте в конструктор метод withCoWatching .

В следующем примере кода показана базовая инициализация клиентского объекта совместного наблюдения:

Джава

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

Уведомлять о действиях пользователя

Когда локальный пользователь выполняет действия (например, приостанавливает или ищет воспроизведение мультимедиа на своем устройстве), библиотека должна быть проинформирована, чтобы эти действия можно было отразить для других участников совместного просмотра. Пример уведомления библиотеки о нескольких состояниях см. в разделе Начало работы .

Вы можете контролировать состояние совместного просмотра, используя следующие методы:

  • CoWatchingClient.notifyBuffering : уведомляет Meet о том, что медиафайл не готов к воспроизведению из-за буферизации, предыдущего переключения мультимедиа, поиска мультимедиа или обычной перегрузки сети.
  • CoWatchingClient.notifyEnded : уведомляет Meet о том, что медиаплеер достиг конца текущего медиафайла.
  • CoWatchingClient.notifyPauseState Уведомляет Meet о том, что пользователь приостановил или возобновил воспроизведение мультимедиа, чтобы Meet мог отразить это действие для других пользователей.
  • CoWatchingClient.notifyPlayoutRate : уведомляет Meet о том, что пользователь обновил скорость воспроизведения мультимедиа до нового значения (например, 1,25x).
  • CoWatchingClient.notifyQueueUpdate : уведомляет Meet об изменении очереди, поэтому Meet может отразить это для других пользователей.
  • CoWatchingClient.notifyReady : уведомляет Meet о том, что буферизация завершена и медиафайл готов к воспроизведению, начиная с указанной отметки времени.
  • CoWatchingClient.notifySeekToTimestamp : уведомляет Meet о том, что пользователь нашел точку воспроизведения мультимедиа, поэтому Meet может отразить это действие для других пользователей.
  • CoWatchingClient.notifySwitchedToMedia : уведомляет Meet о том, что пользователь переключил носитель, поэтому Meet может передать это другим пользователям. Также имеется возможность одновременного обновления очереди.

В следующем примере кода показано, как уведомить пользователей:

Джава

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

Управление удаленным состоянием

Чтобы применить входящие обновления от удаленных участников, вы должны предложить Meet возможность напрямую управлять состоянием локального воспроизведения мультимедиа с помощью обратного вызова CoWatchingHandler.onCoWatchingStateChanged() .

Meet также необходимо получить текущую позицию воспроизведения мультимедиа, вызвав обратный вызов CoWatchingHandler.onStateQuery() . Это вызывается регулярно, поэтому его следует записать с учетом производительности (например, <100 мс).

В следующем примере кода показана реализация CoWatchingHandler :

Джава

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