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