Bu sayfada, birlikte izleme senaryosunu desteklemek için Co-Watching API'nin nasıl kullanılacağı açıklanmaktadır.
İlk kurulum
Canlı paylaşım uygulamasının, kitaplığı kullanıma hazırlamak için birlikte izleme oturumunu temsil eden bir CoWatchingClient
nesnesi başlatması gerekir.
Meet canlı paylaşım SDK'sını kullanmak için AddonClientFactory.getClient
yöntemini çağırın. Bu, birlikte izleme oturumu için giriş noktası olarak işlev gören bir AddonClient
döndürür.
İstemciyi kullanmak istiyorsanız AddonClient
üzerinden newSessionBuilder
yöntemini çağırarak yeni bir AddonSession
için derleyici döndürün.
newSessionBuilder
, oturum için eklentinin sağladığı geri çağırmaları işlemek için AddonSessionHandler
arayüzünü uygular.
Oturum başlatmak için oluşturucuya withCoWatching
yöntemini ekleyin.
Aşağıdaki kod örneğinde, birlikte izleme istemci nesnesinin temel bir ilk kullanıma hazırlanması gösterilmektedir:
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();
}
Kullanıcı işlemleri olduğunda bildirim gönder
Yerel kullanıcı, cihazında medya içeriğini oynatma veya oynatma gibi işlemler gerçekleştirdiğinde, bu işlemlerin birlikte izleme deneyimindeki diğer katılımcılara yansıtılabilmesi için kitaplık bilgilendirilmelidir. Kitaplığı birden fazla durum hakkında bilgilendirmeyle ilgili bir örnek için Başlarken bölümüne bakın.
Birlikte izleme durumunu şu yöntemleri kullanarak kontrol edebilirsiniz:
CoWatchingClient.notifyBuffering
: Meet'e, önceki bir medya geçişi, medya arama işlemi veya normal ağ tıkanıklığı nedeniyle arabelleğe alma nedeniyle medyanın oynatılmaya hazır olmadığını bildirir.CoWatchingClient.notifyEnded
: Meet'e, medya oynatıcının mevcut medyanın sonuna ulaştığını bildirir.CoWatchingClient.notifyPauseState
Meet'e kullanıcının medya oynatmayı duraklattığını veya devam ettirdiğini bildirerek Meet'in bu işlemi diğer kullanıcılara yansıtabilmesi için bunu yapmanız gerekir.CoWatchingClient.notifyPlayoutRate
: Kullanıcının, medyanın oynatma oranını yeni bir değerle (ör.1,25x) güncellediğini Meet'e bildirir.CoWatchingClient.notifyQueueUpdate
: Meet'e sıranın değiştiğini bildirir. Böylece Meet bunu diğer kullanıcılara yansıtabilir.CoWatchingClient.notifyReady
: Meet'e, sağlanan zaman damgasından başlayarak arabelleğe alma işleminin tamamlandığını ve medyanın artık oynatılmaya hazır olduğunu bildirir.CoWatchingClient.notifySeekToTimestamp
: Meet'e, kullanıcının medyanın oynatma noktasını aradığını bildirir. Böylece Meet bu işlemi diğer kullanıcılara yansıtabilir.CoWatchingClient.notifySwitchedToMedia
: Meet'e, kullanıcının medya değiştirdiğini bildirir. Böylece Meet bunu diğer kullanıcılara iletebilir. Eş zamanlı sıra güncelleme seçeneği de vardır.
Aşağıdaki kod örneğinde, kullanıcıların nasıl bilgilendirileceği gösterilmektedir:
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);
};
Uzak durumu yönet
Uzak katılımcılardan gelen güncellemeleri uygulamak için CoWatchingHandler.onCoWatchingStateChanged()
geri çağırmasını kullanarak Meet'e yerel medya oynatma durumunu doğrudan yönetebileceğiniz bir yöntem sunmanız gerekir.
Meet'in, CoWatchingHandler.onStateQuery()
geri çağırmasını yaparak medya oynatmanın mevcut konumunu da alması gerekir. Bu, düzenli olarak adlandırılır. Bu nedenle, yüksek performanslı olacak şekilde yazılmalıdır (örneğin, <100 ms).
Aşağıdaki kod örneğinde CoWatchingHandler
uygulaması gösterilmektedir:
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));
}
}