Halaman ini menjelaskan cara menggunakan Co-Watching API untuk mendukung skenario menonton bersama.
Penyiapan awal
Agar library dapat digunakan, aplikasi berbagi live harus melakukan inisialisasi 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
mengimplementasikan
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 tentang tindakan pengguna
Saat pengguna lokal melakukan tindakan—misalnya, menjeda atau mencari tata letak media di perangkat mereka—library harus diberi tahu agar tindakan tersebut dapat dicerminkan ke peserta lain dalam pengalaman menonton bersama. Untuk contoh cara memberi tahu library tentang beberapa status, lihat Memulai.
Anda dapat mengontrol status menonton bersama menggunakan metode berikut:
CoWatchingClient.notifyBuffering
: Memberi tahu Meet bahwa media tidak siap diputar karena buffering, yang disebabkan oleh peralihan 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 melanjutkan pemutaran media, sehingga Meet dapat mencerminkan tindakan tersebut untuk pengguna lain.CoWatchingClient.notifyPlayoutRate
: Memberi tahu Meet bahwa pengguna telah memperbarui kecepatan 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 ke pengguna lain. Juga memiliki opsi untuk pembaruan antrean secara 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
Meet cara 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()
. Metode ini dipanggil secara berkala 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));
}
}