Wdrażanie interfejsu Co-Watching API

Na tej stronie opisujemy, jak wykorzystać interfejs Co-Watching API do wspierania scenariusza wspólnego oglądania.

Konfiguracja początkowa

Aby przygotować bibliotekę do użycia, aplikacja do udostępniania na żywo powinna zainicjować obiekt CoWatchingClient reprezentujący sesję wspólnego oglądania.

Aby użyć pakietu SDK do udostępniania na żywo w Meet, wywołaj metodę AddonClientFactory.getClient. Zwraca on element AddonClient, który służy jako punkt wejścia do sesji wspólnego oglądania.

Aby użyć klienta, wywołaj metodę newSessionBuilder z AddonClient w celu zwrócenia konstruktora dla nowego obiektu AddonSession. newSessionBuilder implementuje interfejs AddonSessionHandler do obsługi wywołań zwrotnych udostępnianych przez dodatek w tej sesji.

Aby rozpocząć sesję, dodaj do kreatora metodę withCoWatching.

Poniższy przykładowy kod przedstawia podstawowe zainicjowanie obiektu klienta wspólnego oglądania:

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

Powiadamiaj użytkownika o działaniach

Gdy użytkownik lokalny wykona określone działania – na przykład wstrzymuje odtwarzanie lub przewija multimedia na swoim urządzeniu – trzeba o tym poinformować bibliotekę, aby te działania mogły być powielane innym uczestnikom w ramach wspólnego oglądania. Przykładowe informacje o tym, jak powiadomić bibliotekę o wielu stanach, znajdziesz w sekcji Pierwsze kroki.

Stan wspólnego oglądania możesz kontrolować, korzystając z tych metod:

  • CoWatchingClient.notifyBuffering: powiadamia Meet, że multimedia nie są gotowe do odtworzenia z powodu buforowania z powodu wcześniejszego przełączenia multimediów, wyszukiwania multimediów lub normalnego przeciążenia sieci.
  • CoWatchingClient.notifyEnded: powiadamia Meet, że odtwarzacz multimedialny dotarł do końca.
  • CoWatchingClient.notifyPauseState Powiadom Meet, że użytkownik wstrzymał lub wznowił odtwarzanie multimediów, aby usługa Meet mogła powielić to działanie u innych użytkowników.
  • CoWatchingClient.notifyPlayoutRate: powiadamia Meet, że użytkownik zmienił szybkość odtwarzania multimediów do nowej wartości (na przykład 1,25x).
  • CoWatchingClient.notifyQueueUpdate: powiadamia Meet o zmianie kolejki i może powielić to u innych użytkowników.
  • CoWatchingClient.notifyReady: powiadamia Meet o zakończeniu buforowania i zakończeniu buforowania, a multimedia są gotowe do odtwarzania, począwszy od podanej sygnatury czasowej.
  • CoWatchingClient.notifySeekToTimestamp: powiadamia Meet, że użytkownik przeszukał punkt odtwarzania multimediów, dzięki czemu Meet może powielić to działanie u innych użytkowników.
  • CoWatchingClient.notifySwitchedToMedia: powiadamia Meet o przełączeniu multimediów, aby Meet może przekazać je innym użytkownikom. Udostępnia też opcję równoczesnej aktualizacji kolejki.

Poniższy przykładowy kod pokazuje, jak powiadamiać użytkowników:

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

Zarządzaj stanem zdalnym

Aby zastosować przychodzące aktualizacje od uczestników zdalnych, musisz zaoferować Meet sposób bezpośredniego zarządzania lokalnym stanem odtwarzania multimediów za pomocą wywołania zwrotnego CoWatchingHandler.onCoWatchingStateChanged().

Meet musi też pobrać bieżącą pozycję odtwarzania multimediów, wywołując wywołanie zwrotne CoWatchingHandler.onStateQuery(). Ten parametr jest nazywany regularnie, więc powinien być zapisany tak, aby był skuteczny (np. <100 ms).

Ten przykładowy kod zawiera implementację 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));
  }
}