Co-Watching API implementieren

Auf dieser Seite wird beschrieben, wie die Co-Watching API für ein Szenario zum gemeinsamen Ansehen verwendet wird.

Ersteinrichtung

Um die Bibliothek für die Verwendung vorzubereiten, sollte die Live Sharing-Anwendung ein CoWatchingClient-Objekt initialisieren, das eine gemeinsame Videositzung darstellt.

Rufen Sie die Methode AddonClientFactory.getClient auf, um das Meet Live Sharing SDK zu verwenden. Dadurch wird ein AddonClient zurückgegeben, das als Einstiegspunkt für die gemeinsame Wiedergabe dient.

Wenn Sie den Client verwenden möchten, rufen Sie die Methode newSessionBuilder aus dem AddonClient auf, um einen Builder für eine neue AddonSession zurückzugeben. Der newSessionBuilder implementiert die Schnittstelle AddonSessionHandler zur Verarbeitung der Callbacks, die vom Add-on für die Sitzung bereitgestellt werden.

Fügen Sie dem Builder die Methode withCoWatching hinzu, um eine Sitzung zu starten.

Das folgende Codebeispiel zeigt eine grundlegende Initialisierung des Clientobjekts zum Co-Watching:

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

Bei Nutzeraktionen benachrichtigen

Wenn der lokale Nutzer Aktionen ausführt, z. B. das Pausieren oder Suchen der Medienwiedergabe auf seinem Gerät, muss die Bibliothek darüber informiert werden, damit diese Aktionen für andere Teilnehmer der gemeinsamen Wiedergabe gespiegelt werden können. Ein Beispiel für das Benachrichtigen der Bibliothek für mehrere Bundesstaaten findest du unter Erste Schritte.

So können Sie den Status der gemeinsamen Wiedergabe festlegen:

  • CoWatchingClient.notifyBuffering: Hiermit wird Meet darüber informiert, dass die Medien aufgrund eines vorherigen Medienwechsels, einer Mediensuche oder einer normalen Netzwerküberlastung aufgrund von Zwischenspeichern nicht abgespielt werden können.
  • CoWatchingClient.notifyEnded: Hiermit wird Meet darüber informiert, dass der Mediaplayer das Ende des aktuellen Mediums erreicht hat.
  • CoWatchingClient.notifyPauseState Informieren Sie Meet darüber, dass der Nutzer die Wiedergabe von Medien pausiert oder fortgesetzt hat, damit Meet diese Aktion für andere Nutzer spiegeln kann.
  • CoWatchingClient.notifyPlayoutRate: Hiermit wird Meet darüber informiert, dass der Nutzer die Wiedergaberate der Medien auf einen neuen Wert aktualisiert hat (z. B. 1,25x).
  • CoWatchingClient.notifyQueueUpdate: Hiermit wird Meet darüber informiert, dass sich die Warteschlange geändert hat, sodass Meet dies für andere Nutzer spiegeln kann.
  • CoWatchingClient.notifyReady: Informiert Meet darüber, dass die Zwischenspeicherung abgeschlossen ist und die Medien jetzt ab dem angegebenen Zeitstempel abgespielt werden können.
  • CoWatchingClient.notifySeekToTimestamp: Informiert Meet darüber, dass der Nutzer zum Wiedergabepunkt des Mediums gewechselt hat, sodass Meet diese Aktion für andere Nutzer spiegeln kann.
  • CoWatchingClient.notifySwitchedToMedia: Informiert Meet darüber, dass der Nutzer das Medium gewechselt hat, damit Meet dies an andere Nutzer weiterleiten kann. Es bietet auch eine Option zur gleichzeitigen Aktualisierung der Warteschlange.

Das folgende Codebeispiel zeigt, wie Nutzer benachrichtigt werden:

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

Remote-Status verwalten

Damit eingehende Updates von Remote-Teilnehmern angewendet werden, müssen Sie Meet eine Möglichkeit bieten, den Status der lokalen Medienwiedergabe direkt mit dem CoWatchingHandler.onCoWatchingStateChanged()-Callback zu verwalten.

Meet muss außerdem die aktuelle Position der Medienwiedergabe durch Aufrufen des CoWatchingHandler.onStateQuery()-Callbacks abrufen. Dies wird regelmäßig aufgerufen, daher sollte es so geschrieben werden, dass es leistungsfähig ist (z. B. < 100 ms).

Das folgende Codebeispiel zeigt eine Implementierung von 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));
  }
}