

# Amazon IVS ストリームで複数ホストを有効にする
<a name="multiple-hosts"></a>

Amazon Interactive Video Service (IVS) により、開発者は複数のブロードキャスター (ホストとも呼ばれます) の動画とオーディオを結合するアプリケーションを構築できます。

ユースケースを以下に示します。
+ ゲストスポット — ブロードキャスターは視聴者をブロードキャストに招待できます。これにより、カラオケや Q&A などのコラボレーションコンテンツへの扉が開かれます。
+ バーサス (VS) モード — ブロードキャスター同士がマッチングして競い合います(歌唱コンクールなど)。
+ グループブロードキャスト — 複数のスピーカーが大勢の視聴者の前で互いに会話できます。

ライブストリームに複数のブロードキャスターを追加するには、IVS リアルタイムストリーミングと IVS 低レイテンシーストリーミングの両方を使用する必要があります。IVS リアルタイムストリーミングはビデオストリームとオーディオストリームを組み合わせるもので、低レイテンシーストリーミングは組み合わせたストリームを視聴者にブロードキャストします。

リアルタイムストリーミングは、ステージと呼ばれるリソースを提供します。これはブロードキャスター (ホスト) がリアルタイムでオーディオと動画を交換できる仮想スペースです。その後、ステージをチャネルにブロードキャストしてより多くの視聴者にリーチしたり、視聴者を「ステージ」に連れて行って進行中の会話に貢献できるアプリケーションを構築したりできます。

IVS リアルタイムストリーミングの詳細については、以下を参照してください。
+ [IVS リアルタイムストリーミングユーザーガイド](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/what-is.html)
  + IVS Broadcast SDK にはリアルタイム機能が組み込まれています。これらの SDK ([ウェブ](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-web.html)、[Android](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-android.html)、[iOS](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-ios.html)) のガイド、特に「公開と購読」のセクションを参照してください。
+  「[IVS Real-Time Streaming API リファレンス](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html)」

# IVS での複数のホストの使用開始
<a name="multiple-hosts-getting-started"></a>

このドキュメントでは、Amazon IVS で複数のホストの使用を開始するための手順について説明します。

## コンソールでの手順
<a name="multiple-hosts-setup-console"></a>

新しいステージとそのステージの参加者トークンを作成するには、次の手順に従います。

1. [Amazon IVS コンソール](https://console.aws.amazon.com/ivs)を開きます。

   ([AWS マネジメントコンソール](https://console.aws.amazon.com/)から Amazon IVS コンソールにアクセスすることもできます。)

1. 左側のナビゲーションペインで **[ステージ]** を選択し、**[ステージを作成]** を選択します。**[ステージを作成]** ウィンドウが表示されます。  
![\[[ステージを作成] ウィンドウを使用して、新しいステージとそのステージの参加者トークンを作成します。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/images/Create_Stage_Console_IPR.png)

1. 必要に応じて、**[ステージ名]** を入力します。**[ステージを作成]** を選択してステージを作成します。新しいステージのステージ詳細ページが表示されます。

1. **[参加者トークンを作成]** を選択します。

1. **[参加者トークンを作成]** ダイアログで、ユーザー ID を入力し、**[参加者トークンを作成]** を選択します。トークンは **[参加者トークン]** テーブルの上部に表示されます。トークンをコピーするには、[トークンをコピー] のアイコン (参加者トークンの左側) をクリックします。

## CLI の手順
<a name="multiple-hosts-setup-cli"></a>

AWS CLI の使用は詳細オプションであり、まず CLI をダウンロードしてマシン上で設定する必要があります。詳細については、「[AWS Command Line Interface のユーザーガイド](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」を参照してください。

CLI を使用してリソースを作成し、管理できるようになりました。ステージ API は ivs-realtime 名前空間の下にあります。例えば、ステージを作成するには以下のようにします。

```
aws ivs-realtime create-stage --name "test-stage"
```

レスポンスは次のとおりです。

```
{
   "stage": {
      "arn": "arn:aws:ivs:us-west-2:376666121854:stage/VSWjvX5XOkU3",
      "name": "test-stage"
   }
}
```

そのステージの参加者トークンを作成するには

```
aws ivs-realtime create-participant-token --stage-arn arn:aws:ivs:us-west-2:376666121854:stage/VSWjvX5XOkU3
```

レスポンスは次のとおりです。

```
{
   "participant": {
      "participantId": "jFpWmveENolS",
      "expirationTime": "2022-08-26T19:17:00+00:00",
      "token": "eyJhbGciOiJLTVMiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjE1NDE0MjAsImp0aSI6ImpGcFdtdmVFTm9sUyIsInJlc291cmNlIjoiYXJuOmF3czppdnM6dXMtd2VzdC0yOjM3NjY2NjEyMTg1NDpzdGFnZS9NbzhPUWJ0RGpS123JldmVudHNfdXJsIjoid3NzOi8vdXMtd2VzdC0yLmV2ZW50cy5saXZlLXZpZGVvLm5ldCIsIndoaXBfdXJsIjoiaHR0cHM6Ly82NmY3NjVhYzgzNzcuZ2xvYmFsLndoaXAubGl2ZS12aWRlby5uZXQiLCJjYXBhYmlsaXRpZXMiOnsiYWxsb3dfcHVibGlzaCI6dHJ1ZSwiYWxsb3dfc3Vic2NyaWJlIjp0cnVlfX0.MGQCMGm9affqE3B2MAb_DSpEm0XEv25hfNNhYn5Um4U37FTpmdc3QzQKTKGF90swHqVrDgIwcHHHIDY3c9eanHyQmcKskR1hobD0Q9QK_GQETMQS54S-TaKjllW9Qac6c5xBrdAk"
   }
}
```

# ステージのブロードキャスト: クライアントサイトとサーバーサイドのコンポジションの対比
<a name="multiple-hosts-broadcasting-client-vs-server"></a>

開発者がステージを IVS チャネルにブロードキャストする場合には、以下の 2 種類の選択肢があります。
+ *クライアントサイドコンポジション*では、ホストはステージに接続し、他のホストから動画をダウンロードし、それらを 1 つのストリームに結合して、結合済みのストリームを IVS チャネルにブロードキャストします。この方法では、アプリ開発者が Mixer API を使用してコンポジションの外観を制御できるなど、レイアウトの柔軟性が非常に高くなります。ただし、クライアントサイドコンポジションでは、コンポジションを作成するためにクライアント CPU リソースがより多く必要であり、コンポジションのブロードキャストにもより多くの帯域幅が要求されます。また、ステージをブロードキャストするホストにネットワークの問題があると、視聴者に向けたライブストリームにも影響が出ることがあります。

  オーバーレイを組み込んだり、サーバーサイドコンポジションと互換性のない要素をカスタマイズしたりするなど、ブロードキャストのコンテンツを高度にパーソナライズする必要がある場合には、クライアントサイドコンポジションが推奨されます。
+ *サーバーサイドコンポジション*では、クライアントは、IVS ステージのコンポジションとブロードキャストをクラウドサービスにオフロードします。サーバーサイドコンポジションおよびチャネルへの RTMP 配信は、ステージのホームリージョンにある IVS コントロールプレーンオペレーションを介して呼び出されます。数多くの利点を備えたサーバーサイドコンポジションは、効率的で信頼性の高いライブストリーミングを求めるユーザーにとって、魅力的な選択肢です。
  + **軽減されたクライアント負荷** – サーバーサイドコンポジションでは、音声と動画ソースを組み合わせる作業が、個別のクライアントデバイスからサーバー側に移転されます。サーバーサイドコンポジションにより、ビューを合成してIVS に送信するクライアントデバイスは、CPU とネットワークリソースを使用しなくても良くなります。
  + **レジリエンス** – コンポジションプロセスをサーバー上で一元化することで、ブロードキャストをより堅牢にできます。パブリッシャーのデバイスに技術的な制限がかかっていたり、ネットワークの変動があったりしても、サーバーはこれに適応し、すべての視聴者にスムーズなストリームを提供できます。
  + **帯域幅の効率性** – サーバーがコンポジションを処理するため、ステージパブリッシャーは、IVS チャネルにf動画をブロードキャストする帯域幅を余分に消費する必要がありません。

詳しくは、「*IVS リアルタイムストリーミングユーザーガイド*」の「[サーバーサイドコンポジション](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html)」を参照してください。

# IVS での複数のホストのデモ
<a name="multiple-hosts-demo"></a>

シナリオ: Alice (A) は Amazon IVS チャネルにブロードキャストしていて、Bob (B) をゲストとしてステージに招待したいと考えています。(実際のブロードキャストでは、A と B はアリスとボブの画像になります。)

![\[デモシナリオ: アリス (A) は Amazon IVS チャネルにブロードキャストしていて、ボブ (B) をゲストとしてステージに招待したいと考えています。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/images/Demo_Intro.png)


## 1. ステージの作成
<a name="multiple-hosts-demo-create-stage"></a>

Amazon IVS ステージ API を使用した [CreateStage](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStage.html) リクエストは次のとおりです。

```
POST /CreateStage HTTP/1.1
Content-type: application/json
{
   "name": "string",
   "participantTokenConfigurations": [
      {
         "userId": "9529828585",
         "attributes": {"displayName": "Alice"}
      },
      {
         "userId": "4875935192",
         "attributes": {"displayName": "Bob"}
      }
   ]
}
```

ここで行っているように、ステージを作成するときに参加者トークンを事前に作成できます。[CreateParticipantToken](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateParticipantToken.html) を呼び出すことで、既存のステージのトークンを作成することもできます。参加者ごとに、カスタム `userId` と `attributes` のセットを渡すことができます。(**重要**: `attributes` および `userId` リクエストフィールドはすべてのステージ参加者に公開されます。これらを個人を特定する情報、機密情報、または機密情報には使用しないでください。)

上記のリクエストに対するネットワークの応答は次のとおりです。

```
HTTP/1.1 200
Content-type: application/json
{
   "stage": {
      "arn": "arn:aws:ivs:us-west-2:123456789012:stage/abcdABCDefgh",
      "name": "alice-stage"
   },
   "participantTokens": [
      {
         "participantId": "e94e506e-f7...",
         "token": "eyJhbGci0iJ...",
         "userId": "9529828585",
         "attributes": {"displayName" : "Alice"},
         "expirationTime": number
      },
      {
         "participantId": "b5c6a79a-6e...",
         "token": "eyJhbGci0iJ...",
         "userId": "4875935192",
         "attributes": {"displayName" : "Bob"},
         "expirationTime": number
      }
   ]
}
```

## 2. 参加者トークンの配布
<a name="multiple-hosts-demo-distribute-tokens"></a>

これで、クライアントは Alice (A) と Bob (B) のトークンを手に入れました。デフォルトでは、トークンは 1 時間有効です。オプションで、ステージの作成時にカスタム `duration` を渡すことができます。トークンはステージに参加するために使用できます。

![\[サーバーから各クライアントにトークンを配布する方法 (WebSocket チャネル経由など)。この機能は提供していません。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/images/Demo_Distribute_Participant_Token_crop.png)


サーバーから各クライアントにトークンを配布する方法が必要になります (WebSocket チャネル経由など)。この機能は提供していません。

## 3. ステージに参加する
<a name="multiple-hosts-demo-join-stage"></a>

参加者は Android または iOS の Amazon IVS Broadcast SDK を介してステージに参加できます。各参加者の動画の品質を設定できます。ここでは、アリスが最初にステージに参加する様子を示します。

アーキテクチャの概要は次のとおりです。

![\[参加者は Android または iOS の Amazon ブロードキャスト SDK を介してステージに参加できます。ここでは、アリスが最初にステージに参加する様子を示します。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/images/Demo_Join_the_Stage_crop.png)


そして、これがステージに参加するための Android コードサンプルです。以下のコードスニペットは Alice のデバイスで動作します。`join()` の呼び出しでは、Alice がステージに参加します。上の図は、このコード実行の結果を示しており、Alice はステージに参加して公開中です (ステップ 1 で始めたチャネルへのブロードキャストに加えて)。

```
// Create streams with the front camera and first microphone.
var deviceDiscovery = DeviceDiscovery(context)
var devices : List<Device> = deviceDiscovery.listLocalDevices()
var publishStreams = ArrayList<LocalStageStream>()

// Configure video quality if desired
var videoConfiguration = StageVideoConfiguration()

// Create front camera stream
var frontCamera = devices.find { it.descriptor.type == Device.Descriptor.DeviceType.Camera && it.descriptor.position == Device.Descriptor.Position.FRONT }
var cameraStream = ImageLocalStageStream(frontCamera, videoConfiguration)
publishStreams.add(cameraStream)

// Create first microphone stream
var microphone = devices.find { it.descriptor.type == Device.Descriptor.DeviceType.Microphone }
var microphoneStream = AudioLocalStageStream(microphone)
publishStreams.add(microphoneStream)

// A basic Stage.Strategy implementation that indicates the user always wants to publish and subscribe to other participants.
// Provides the front camera and first microphone as publish streams.

override fun shouldPublishFromParticipant(stage: Stage, participantInfo: ParticipantInfo) : Boolean {
   return true
}

override fun shouldSubscribeToParticipant(stage: Stage, participantInfo: ParticipantInfo) : Stage.SubscribeType {
   return Stage.SubscribeType.AUDIO_VIDEO
}

override fun stageStreamsToPublishForParticipant(stage: Stage, participantInfo: ParticipantInfo): List<LocalStageStream> {
   return publishStreams
}

// Create Stage using the strategy and join
var stage = Stage(context, token, strategy)

try {
   stage.join()
} catch (exception: BroadcastException) {
   // handle join exception
}
```

## 4. ステージをブロードキャストする
<a name="multiple-hosts-demo-broadcast-stage"></a>

### クライアントサイドコンポジション
<a name="demo-broadcast-stage-client-side"></a>

![\[ステージのブロードキャスト: クライアントサイドコンポジション。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_1_crop.png)


ステージをブロードキャストするための Android コードサンプルを次に示します。

```
var broadcastSession = BroadcastSession(context, broadcastListener, configuration, null)

// StageRenderer interface method to be notified when remote streams are available
override fun onStreamsAdded(stage: Stage, participantInfo: ParticipantInfo, streams: List<StageStream>) {

   var id = participantInfo.participantId
	
   // Create mixer slot for remote participant
   var slot = BroadcastConfiguration.Mixer.Slot.with { s ->
      s.name = id
      // Set other properties as desired
      ...
      s
   }

   broadcastSession.mixer.addSlot(slot)

   // Attach remote stream devices, bind to mixer slot
   streams.forEach { stream ->
      broadcastSession.attachDevice(stream.getDevice())
      broadcastSession.mixer.bind(stream.getDevice(), id)
   }
}

// Start broadcasting
try {
   broadcastSession.start(IVS_RTMPS_URL, IVS_STREAM_KEY)
} catch (exception: BroadcastException) {
   // handle exception
}
```

Android と iOS の Amazon IVS Broadcast SDK には、動的な UI を簡単に構築できるように、参加者のステータス (例: `onStreamsAdded` と `onStreamsRemoved`) によってトリガーされるコールバックがあります。これはコードサンプルの最初の部分に示されており、Bob のビデオとオーディオが視聴可能になると、Alice に `onStreamsAdded` コールバックで通知されます。

その後、Alice は Bob のビデオとオーディオをミキサーに追加して、チャネルの幅広い視聴者向けに RTMP ブロードキャストに含めることができます。これはコードサンプルの残りの部分に示されています。

現在、Alice は Amazon IVS Android ブロードキャスト SDK を介して複数の視聴者にブロードキャストしています。これはアーキテクチャ的には次のようになります。

![\[ステージのブロードキャスト: クライアントサイドコンポジション。アリスは複数の視聴者にブロードキャストしています。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_2_crop.png)


### サーバーサイドコンポジション
<a name="demo-broadcast-stage-server-side"></a>

比較のため、[サーバーサイドコンポジション](multiple-hosts-broadcasting-client-vs-server.md)の仕組みを以下に示します。(詳細については、「*IVS リアルタイムストリーミングユーザーガイド*」の「[サーバーサイドコンポジション](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html)」を参照してください。)

![\[ステージのブロードキャスト: サーバーサイドコンポジション。\]](http://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Server_Side_Composition.png)
