Wdrażanie interfejsu Co-Watching API

Na tej stronie dowiesz się, jak za pomocą interfejsu Co-Watching API w ramach scenariusza wspólnego oglądania.

Konfiguracja początkowa

Aby przygotować bibliotekę do użycia, aplikacja do udostępniania na żywo powinna zainicjować 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 . Powoduje to zwrócenie AddonClient który jest punktem wyjścia dla sesji wspólnego oglądania.

Aby użyć klienta, wywołaj metodę newSessionBuilder z AddonClient, aby zwrócić konstruktor dla nowego AddonSession newSessionBuilder implementuje metodę AddonSessionHandler do obsługi wywołań zwrotnych udostępnianych przez dla danej sesji.

Aby rozpocząć sesję, dodaj withCoWatching w konstruktorze.

Poniższy przykładowy kod pokazuje podstawowe inicjowanie klienta wspólnego oglądania obiekt:

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 użytkownik lokalny wykonuje działania, np. wstrzyma lub przewinie multimedia – biblioteka musi zostać o tym poinformowana, aby te działania powielane przez innych uczestników wspólnego oglądania. Na przykład: jak powiadomić bibliotekę w wielu stanach, zawiera artykuł Pobieranie rozpoczęto.

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

  • CoWatchingClient.notifyBuffering: Powiadamia Meet, że multimedia nie są gotowe do odtwarzania na buforowanie z powodu wcześniejszego przełącznika multimediów, przewijania multimediów lub normalnej sieci zatłoczenie.
  • CoWatchingClient.notifyEnded: Powiadamia Meet, że odtwarzacz dotarł do końca bieżących mediów.
  • CoWatchingClient.notifyPauseState Powiadamianie Meet o wstrzymaniu lub wznowieniu odtwarzania przez użytkownika multimediów, więc Meet może pokazać to działanie u innych użytkowników.
  • CoWatchingClient.notifyPlayoutRate: Powiadamia Meet, że użytkownik zaktualizował częstotliwość odtworzeń mediów na nową wartość (np.1, 25x).
  • CoWatchingClient.notifyQueueUpdate: Powiadamia Meet o zmianie kolejki, więc Meet może powielać te ustawienia dla innych użytkowników.
  • CoWatchingClient.notifyReady: Powiadamia Meet, że buforowanie zostało zakończone, a multimedia zostały gotowy do odtworzenia, począwszy od podanej sygnatury czasowej.
  • CoWatchingClient.notifySeekToTimestamp: Powiadamia Meet, że użytkownik przeszukał punkt odtwarzania wyświetlanie multimediów, tak aby usługa Meet mogła pokazać to działanie u innych użytkowników.
  • CoWatchingClient.notifySwitchedToMedia: Powiadamia Meet o tym, że użytkownik przełączył multimedia, Meet może przekazywać te informacje innym użytkownikom. Dostępna jest też opcja do 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 oferować Poznaj sposób bezpośredniego zarządzania lokalnym stanem odtwarzania multimediów za pomocą CoWatchingHandler.onCoWatchingStateChanged() oddzwanianie.

Meet musi też pobrać bieżącą pozycję multimediów przez wywołanie funkcji CoWatchingHandler.onStateQuery() oddzwanianie. Nazywa się ją regularnie, więc powinna być przygotowana tak, by zapewnić mu dobrą skuteczność. (na przykład <100 ms).

Poniższa próbka kodu pokazuje implementację funkcji 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));
  }
}