Wdrażanie interfejsu Co-Watching API

Na tej stronie dowiesz się, jak korzystać z interfejsu Co-Watching API w celu obsługi scenariusza wspólnego oglądania.

Konfiguracja początkowa

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

Aby używać pakietu SDK udostępniania na żywo w Meet, wywołaj metodę AddonClientFactory.getClient. Zwraca obiekt AddonClient, który jest punktem wejścia sesji wspólnego oglądania.

Aby użyć klienta, wywołaj metodę newSessionBuilder z AddonClient, aby zwrócić kreator dla nowego obiektu AddonSession. newSessionBuilder implementuje interfejs AddonSessionHandler do obsługi wywołań zwrotnych dostarczanych przez dodatek dla sesji.

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

Ten przykładowy kod pokazuje podstawowe inicjowanie 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 o działaniach użytkownika

Gdy lokalny użytkownik wykonuje działania – na przykład wstrzymuje lub przewija odtwarzanie multimediów na urządzeniu – musi poinformować o tym bibliotekę, aby móc zobaczyć te działania innym uczestnikom wspólnego oglądania. Przykład powiadomienia biblioteki w wielu stanach znajdziesz w sekcji Pierwsze kroki.

Stan wspólnego oglądania możesz kontrolować za pomocą tych metod:

  • CoWatchingClient.notifyBuffering: informuje Meet, że multimedia nie są gotowe do odtwarzania z powodu buforowania z powodu wcześniejszego przełączania multimediów, przewijania multimediów lub normalnego przeciążenia sieci.
  • CoWatchingClient.notifyEnded: informuje Meet, że odtwarzacz dotarł do końca bieżących multimediów.
  • CoWatchingClient.notifyPauseState Powiadom Meet o wstrzymaniu lub wznowieniu odtwarzania multimediów przez użytkownika, aby usługa Meet mogła powielić tę czynność u innych użytkowników.
  • CoWatchingClient.notifyPlayoutRate: informuje Meet, że użytkownik zmienił częstotliwość odtwarzania multimediów do nowej wartości (na przykład 1,25x).
  • CoWatchingClient.notifyQueueUpdate: powiadomi Meet o zmianie kolejki, więc Meet może powielić tę informację u innych użytkowników.
  • CoWatchingClient.notifyReady: informuje Meet, że buforowanie zostało zakończone i multimedia są teraz gotowe do odtwarzania, począwszy od podanej sygnatury czasowej.
  • CoWatchingClient.notifySeekToTimestamp: powiadomi Meet, że użytkownik przeszukał punkt odtwarzania multimediów, więc Meet może powielić tę czynność u innych użytkowników.
  • CoWatchingClient.notifySwitchedToMedia: powiadomi Meet o tym, że użytkownik przełączył multimedia, aby usługa Meet mogła przekazać tę informację innym użytkownikom. Dostępna jest też opcja jednoczesnej aktualizacji kolejki.

Następujący przykładowy kod pokazuje, jak powiadomić 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 stosować aktualizacje przychodzące od uczestników zdalnych, musisz udostępnić Meet sposób na bezpośrednie zarządzanie lokalnym stanem odtwarzania multimediów przy użyciu wywołania zwrotnego CoWatchingHandler.onCoWatchingStateChanged().

Meet musi również pobrać bieżącą pozycję odtwarzania multimediów, wywołując wywołanie zwrotne CoWatchingHandler.onStateQuery(). Ta funkcja jest wywoływana regularnie, więc należy ją napisać tak, aby była wydajna (np. <100 ms).

Przeanalizuj przykładowy kod poniżej, aby zobaczyć 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));
  }
}