Halaman ini menjelaskan cara menggunakan Co-Watching API untuk mendukung skenario menonton bersama.
Penyiapan awal
Untuk menyiapkan library yang akan digunakan, aplikasi berbagi live harus menginisialisasi
objek CoWatchingClient
yang mewakili sesi menonton bersama.
Untuk menggunakan SDK Berbagi Live Meet, panggil metode AddonClientFactory.getClient
. Tindakan ini akan menampilkan
AddonClient
yang berfungsi sebagai titik entri untuk sesi menonton bersama.
Untuk menggunakan klien, panggil metode
newSessionBuilder
dari AddonClient
guna menampilkan builder untuk
AddonSession
baru.
newSessionBuilder
menerapkan antarmuka
AddonSessionHandler
untuk menangani callback yang disediakan oleh
add-on untuk sesi tersebut.
Untuk memulai sesi, tambahkan metode
withCoWatching
ke builder.
Contoh kode berikut menunjukkan inisialisasi dasar objek 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 pada tindakan pengguna
Saat pengguna lokal melakukan tindakan—misalnya, menjeda atau mencari playout media di perangkat—library harus diberi tahu agar tindakan tersebut dapat dicerminkan ke peserta lain dalam pengalaman menonton bersama. Untuk mengetahui contoh cara memberi tahu library untuk beberapa status, lihat Memulai.
Anda dapat mengontrol status menonton bersama menggunakan metode berikut:
CoWatchingClient.notifyBuffering
: Memberi tahu Meet bahwa media belum siap diputar karena buffering, karena tombol media sebelumnya, pencarian media, atau kemacetan jaringan normal.CoWatchingClient.notifyEnded
: Memberi tahu Meet bahwa pemutar media telah mencapai akhir media saat ini.CoWatchingClient.notifyPauseState
Beri tahu Meet bahwa pengguna telah menjeda atau membatalkan jeda pemutaran media, sehingga 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 telah selesai dan media kini siap diputar, dimulai pada stempel waktu yang diberikan.CoWatchingClient.notifySeekToTimestamp
: Memberi tahu Meet bahwa pengguna telah mencari titik pemutaran media, sehingga Meet dapat mencerminkan tindakan tersebut untuk pengguna lain.CoWatchingClient.notifySwitchedToMedia
: Memberi tahu Meet bahwa pengguna telah beralih media, sehingga Meet dapat meneruskannya kepada pengguna lain. Juga memiliki opsi update 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 update masuk dari peserta jarak jauh, Anda harus menawarkan
cara kepada Meet untuk mengelola status pemutaran media lokal secara langsung menggunakan
callback
CoWatchingHandler.onCoWatchingStateChanged()
.
Meet juga perlu mengambil posisi tata letak
media saat ini dengan memanggil
callback
CoWatchingHandler.onStateQuery()
. Ini dipanggil secara teratur, sehingga harus ditulis agar berperforma tinggi
(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));
}
}