Co-Watching API を実装する

このページでは、Co-Watching API を使用して共視聴のシナリオをサポートする方法について説明します。

初期設定

使用するライブラリを準備するには、ライブ共有アプリケーションで、共視聴セッションを表す CoWatchingClient オブジェクトを初期化する必要があります。

Meet ライブ共有 SDK を使用するには、AddonClientFactory.getClient メソッドを呼び出します。これにより、同時視聴セッションのエントリ ポイントとして機能する AddonClient が返されます。

クライアントを使用するには、AddonClient から newSessionBuilder メソッドを呼び出して、新しい AddonSession のビルダーを返します。newSessionBuilderAddonSessionHandler インターフェースを実装し、セッションのアドオンによって提供されるコールバックを処理します。

セッションを開始するには、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 に通知し、そのアクションを他のユーザーにミラーリングできるようにします。
  • CoWatchingClient.notifyPlayoutRate: メディアの再生レートを新しい値(1.25 倍など)に更新したことを Meet に通知します。
  • CoWatchingClient.notifyQueueUpdate: キューが変更されたことを Meet に通知し、Meet がそれをミラーリングして他のユーザーに表示します。
  • CoWatchingClient.notifyReady: バッファリングが完了し、メディアを再生する準備が整ったことを、指定されたタイムスタンプから Meet に通知します。
  • CoWatchingClient.notifySeekToTimestamp: ユーザーがメディアの再生ポイントをシークしたことを 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 に提供する必要があります。

また、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));
  }
}