Mengimplementasikan Co-Watching API

Halaman ini menjelaskan cara menggunakan Co-Watching API untuk mendukung menonton bersama.

Penyiapan awal

Untuk menyiapkan library yang akan digunakan, aplikasi berbagi live harus melakukan inisialisasi CoWatchingClient yang mewakili sesi menonton bersama.

Untuk menggunakan SDK Berbagi Live Meet, panggil metode AddonClientFactory.getClient . Ini akan mengembalikan AddonClient yang berfungsi sebagai titik entri untuk sesi menonton bersama.

Untuk menggunakan klien, panggil metode newSessionBuilder dari AddonClient untuk menampilkan builder bagi AddonSession. newSessionBuilder mengimplementasikan AddonSessionHandler untuk menangani callback yang disediakan oleh {i>add-on<i} untuk sesi ini.

Untuk memulai sesi, tambahkan withCoWatching ke builder.

Contoh kode berikut menunjukkan inisialisasi dasar klien yang menonton bersama :

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

Beri tahu tentang tindakan pengguna

Saat pengguna lokal melakukan tindakan—misalnya, menjeda atau mencari media {i>playout<i} di perangkat mereka—library harus diberi tahu agar tindakan tersebut dapat mencerminkan peserta lain dalam pengalaman menonton bersama. Misalnya, cara memberi tahu library untuk beberapa status, lihat Mendapatkan memulai.

Anda dapat mengontrol status menonton bersama menggunakan metode berikut:

  • CoWatchingClient.notifyBuffering: Memberi tahu Meet bahwa media belum siap diputar karena hingga buffering, karena pengalihan media sebelumnya, pencarian media, atau jaringan normal padat.
  • CoWatchingClient.notifyEnded: Memberi tahu Meet bahwa pemutar media telah mencapai akhir media saat ini.
  • CoWatchingClient.notifyPauseState Memberi tahu Meet bahwa pengguna telah menjeda atau melanjutkan pemutaran dalam jumlah besar agar Meet dapat mencerminkan tindakan tersebut untuk pengguna lain.
  • CoWatchingClient.notifyPlayoutRate: Memberi tahu Meet bahwa pengguna telah memperbarui rasio pemutaran media ke nilai baru (misalnya, 1,25x).
  • CoWatchingClient.notifyQueueUpdate: Memberi tahu Meet bahwa antrean telah berubah, sehingga Meet dapat mencerminkannya untuk pengguna lain.
  • CoWatchingClient.notifyReady: Memberi tahu Meet bahwa buffering selesai dan media sedang kini siap untuk diputar, dimulai pada stempel waktu yang disediakan.
  • CoWatchingClient.notifySeekToTimestamp: Memberi tahu Meet bahwa pengguna telah mencari titik pemutaran ke media, sehingga Meet dapat mencerminkan tindakan tersebut untuk pengguna lain.
  • CoWatchingClient.notifySwitchedToMedia: Memberi tahu Meet bahwa pengguna telah beralih media, jadi Meet dapat meneruskan informasi tersebut kepada pengguna lain. Juga memiliki opsi untuk pembaruan antrean simultan.

Contoh kode berikut menunjukkan cara memberi tahu pengguna:

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

Mengelola status jarak jauh

Untuk menerapkan pembaruan masuk dari peserta jarak jauh, Anda harus menawarkan Temukan cara untuk mengelola status pemutaran media lokal secara langsung menggunakan tindakan CoWatchingHandler.onCoWatchingStateChanged() .

Meet juga perlu mengambil posisi media saat ini dengan memanggil CoWatchingHandler.onStateQuery() . Ini dipanggil secara berkala sehingga harus ditulis agar berperforma baik (misalnya, <100 md).

Contoh kode berikut menunjukkan implementasi 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));
  }
}