Co-Watching API を実装する

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

初期設定

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

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

クライアントを使用するには、AddonClient から newSessionBuilder メソッドを呼び出して、新しい 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 に通知し、そのアクションを他のユーザーにミラーリングできるようにします。
  • CoWatchingClient.notifyPlayoutRate: ユーザーがメディアの再生速度を新しい値(1.25 倍など)に更新したことを Meet に通知します。
  • 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 に提供する必要があります。

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));
  }
}