Co-Watching API を実装する

このページでは、Co-Watching API を使用して シナリオで説明します

初期設定

ライブラリを使用できるように準備するために、ライブ共有アプリケーションで CoWatchingClient 共視聴セッションを表すオブジェクトです。

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

クライアントを使用するには、 newSessionBuilder メソッドを AddonClient から使用して、新しいジョブのビルダーを返す AddonSessionnewSessionBuilder は、 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: ユーザーが次のプレース レートを更新したことを Meet に通知します。 新しい値(1.25 倍など)に変更します。
  • CoWatchingClient.notifyQueueUpdate: キューが変更されたことを Meet に通知し、 Meet では、これを他のユーザーにミラーリングできます。
  • CoWatchingClient.notifyReady: バッファリングが完了し、メディアが 指定したタイムスタンプから再生する準備が整いました。
  • CoWatchingClient.notifySeekToTimestamp: ユーザーが次の再生ポイントをシークしたことを Meet に通知します。 他のユーザーにもその操作が反映されるようになります。
  • CoWatchingClient.notifySwitchedToMedia: ユーザーがメディアを切り替えたことを Meet に通知し、 Meet ではその内容を他のユーザーに共有できます。もう 1 つは 同時キューをアップデートできます。

次のコードサンプルは、ユーザーに通知する方法を示しています。

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