本頁面說明如何使用 Co-Watching API 支援 共同觀看情境
初始設定
為了準備程式庫使用,即時分享應用程式應將
CoWatchingClient
物件,代表共同觀看工作階段。
如要使用 Meet 即時分享 SDK,請呼叫
AddonClientFactory.getClient
方法。這會傳回
AddonClient
做為共同觀看工作階段的進入點
如要使用用戶端,請呼叫
newSessionBuilder
從 AddonClient
的 方法,為新的
AddonSession
。
newSessionBuilder
會導入
AddonSessionHandler
介面,處理
外掛程式
如要開始練習,請在
withCoWatching
方法新增至建構工具。
下列程式碼範例顯示共同觀看用戶端的基本初始化 物件:
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();
}
在使用者動作時通知
本機使用者執行動作 (例如暫停或尋找媒體) 時 播放裝置 - 程式庫則必須通知使用者,可執行這些動作 與其他參與者同步。舉例來說 要如何針對多個狀態通知程式庫,請參閱取得 已開始。
您可以使用下列方法控制共同觀看狀態:
CoWatchingClient.notifyBuffering
: 通知 Meet 媒體因為問題而無法播放 由於先前的媒體切換、媒體跳轉或一般網路導致緩衝處理的情況 壅塞程度。CoWatchingClient.notifyEnded
: 通知 Meet 媒體播放器已播放到結尾 目前媒體。CoWatchingClient.notifyPauseState
通知 Meet 使用者已暫停或取消暫停播放 方便 Meet 將動作轉換成其他使用者CoWatchingClient.notifyPlayoutRate
: 通知 Meet 使用者已更新播放率 轉換成新的值 (例如 1.25x)。CoWatchingClient.notifyQueueUpdate
: 通知 Meet 佇列已變更,因此 Meet 可以將這些資料投放至其他使用者。CoWatchingClient.notifyReady
: 通知 Meet 裝置已完成緩衝處理,且媒體已啟動 開始播放,從提供的時間戳記開始。CoWatchingClient.notifySeekToTimestamp
: 通知 Meet 使用者已尋找 也能讓 Meet 將動作轉換成其他使用者CoWatchingClient.notifySwitchedToMedia
: 向 Meet 通知使用者已切換媒體,因此 Meet 可以將這項資訊傳送給其他使用者。也提供 就能同時更新佇列。
以下程式碼範例說明如何通知使用者:
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);
};
管理遠端狀態
如要套用遠端參與者傳入的更新,必須提供以下選項
瞭解如何直接管理本機媒體播放狀態
這個
CoWatchingHandler.onCoWatchingStateChanged()
回呼。
Meet 也需要擷取媒體的目前位置
呼叫
CoWatchingHandler.onStateQuery()
回呼。我們會定期呼叫此項目,因此編寫時必須具備高效能
(例如小於 100 毫秒)。
以下程式碼範例顯示
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));
}
}