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ć pisana tak, by zapewnić 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));
}
}