Co-Watching API implementieren

Auf dieser Seite wird beschrieben, wie du die Co-Watching API für ein Szenario mit gemeinsamem Ansehen verwendest.

Ersteinrichtung

Zur Vorbereitung der Bibliothek für die Verwendung sollte die Anwendung „Live teilen“ ein CoWatchingClient-Objekt initialisieren, das eine Sitzung zum gemeinsamen Ansehen darstellt.

Wenn Sie das Meet Live Sharing SDK verwenden möchten, rufen Sie die Methode AddonClientFactory.getClient auf. Dadurch wird ein AddonClient zurückgegeben, das als Einstiegspunkt für das gemeinsame Ansehen dient.

Rufen Sie zur Verwendung des Clients die Methode newSessionBuilder aus AddonClient auf, um einen Builder für einen neuen AddonSession zurückzugeben. Mit newSessionBuilder wird die Schnittstelle AddonSessionHandler implementiert, um die vom Add-on für die Sitzung bereitgestellten Callbacks zu verarbeiten.

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

Das folgende Codebeispiel zeigt eine grundlegende Initialisierung des Clientobjekts zum gemeinsamen Ansehen:

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 und z. B. die Medienwiedergabe auf seinem Gerät pausiert oder danach sucht, muss die Mediathek informiert werden, damit diese Aktionen für andere Teilnehmer beim gemeinsamen Ansehen gespiegelt werden können. Ein Beispiel dafür, wie Sie die Bibliothek für mehrere Bundesstaaten benachrichtigen, finden Sie unter Jetzt starten.

Mit den folgenden Methoden kannst du den Status der gemeinsamen Wiedergabe steuern:

  • CoWatchingClient.notifyBuffering: Informiert Meet darüber, dass die Medien aufgrund einer Zwischenspeicherung, eines vorherigen Medienwechsels, einer Mediensuche oder einer normalen Netzwerküberlastung noch nicht wiedergegeben werden können.
  • CoWatchingClient.notifyEnded: Benachrichtigt Meet, dass der Mediaplayer das Ende der aktuellen Medienwiedergabe erreicht hat.
  • CoWatchingClient.notifyPauseState Benachrichtigen Sie Meet, dass der Nutzer die Medienwiedergabe pausiert oder wieder aktiviert hat, damit diese Aktion in Meet für andere Nutzer übernommen werden kann.
  • CoWatchingClient.notifyPlayoutRate: Informiert Meet darüber, dass der Nutzer die Wiedergaberate des Mediums auf einen neuen Wert aktualisiert hat (z. B. 1,25x).
  • CoWatchingClient.notifyQueueUpdate: Informiert Meet darüber, dass sich die Warteschlange geändert hat, sodass Meet diese Änderung für andere Nutzer übernehmen kann.
  • CoWatchingClient.notifyReady: Benachrichtigt Meet, dass die Zwischenspeicherung abgeschlossen ist und die Medien jetzt ab dem angegebenen Zeitstempel wiedergegeben werden können.
  • CoWatchingClient.notifySeekToTimestamp: Informiert Meet, dass der Nutzer zum Wiedergabepunkt der Medien gesucht hat, sodass Meet diese Aktion für andere Nutzer spiegeln kann.
  • CoWatchingClient.notifySwitchedToMedia: Informiert Meet darüber, dass der Nutzer die Medien gewechselt hat, sodass Meet dies an andere Nutzer weiterleiten kann. Bietet außerdem eine Option für die gleichzeitige 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

Wenn Sie eingehende Updates von Remote-Teilnehmern anwenden möchten, müssen Sie Meet die Möglichkeit bieten, den lokalen Medienwiedergabestatus direkt über den CoWatchingHandler.onCoWatchingStateChanged()-Callback zu verwalten.

Außerdem muss Meet die aktuelle Position der Medienwiedergabe über den CoWatchingHandler.onStateQuery()-Callback abrufen. Dieser wird regelmäßig aufgerufen, daher sollte er so geschrieben werden, dass er 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));
  }
}