

# Aktivierung mehrerer Hosts in einem Amazon-IVS-Stream
<a name="multiple-hosts"></a>

Mit dem Amazon Interactive Video Service (IVS) können Entwickler Anwendungen erstellen, die Video und Audio von mehrere Broadcaster (auch als *Hosts* bezeichnet) in einem Live-Stream kombinieren.

Zu den Anwendungsfällen zählen:
+ Gastauftritte – Broadcaster können Zuschauer zur Übertragung einladen. Das ermöglicht kollaborativen Content wie Karaoke sowie Fragen und Antworten.
+ Versus-Modus (VS) – Die Broadcaster werden einander zugeordnet, um gegeneinander anzutreten (z. B. in einem Gesangswettbewerb).
+ Gruppen-Broadcasts – Mehrere Sprecher können sich vor einem großen Publikum miteinander unterhalten.

Um mehrere Broadcaster zu einem Live-Stream hinzuzufügen, müssen Sie sowohl IVS Echtzeit-Streaming als auch IVS Streaming mit niedriger Latenz verwenden. IVS Echtzeit-Streaming wird zum Kombinieren von Video- und Audiostreams verwendet. Streaming mit niedriger Latenz wird für die Übertragung des kombinierten Streams an die Zuschauer verwendet.

Echtzeit-Streaming stellt eine Ressource bereit, die als Stage bezeichnet wird, eine virtuelle Umgebung, in dem Broadcaster (Hosts) Audio und Video in Echtzeit austauschen können. Anschließend können Sie eine Stage an Kanäle übertragen, um ein größeres Publikum zu erreichen. Außerdem können Sie Anwendungen entwickeln, mit denen die Zuschauer „auf die Stage“ gebracht werden können, um sich am Live-Gespräch zu beteiligen.

Weitere Informationen zum IVS-Echtzeit-Streaming finden Sie unter:
+ [Benutzerhandbuch zum ISV-Echtzeit-Streaming](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/what-is.html)
  + Die IVS Broadcast SDKs verfügen über Echtzeitfunktionen. Weitere Informationen finden Sie in den Handbüchern für diese SDKs: [Web](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-web.html), [Android](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-android.html) und [iOS](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-ios.html), insbesondere in den Abschnitten „Veröffentlichen und Abonnieren“. 
+  [Referenz zur API von IVS-Echtzeit-Streaming](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html)

# Erste Schritte mit mehreren Hosts in IVS
<a name="multiple-hosts-getting-started"></a>

Dieses Dokument führt Sie durch die Schritte zum Einstieg in die Verwendung mehrerer Hosts in Amazon IVS.

## Anleitung für die Konsole
<a name="multiple-hosts-setup-console"></a>

Gehen Sie folgendermaßen vor, um mithilfe folgender Schritte eine neue Stage und ein Teilnehmer-Token dafür zu erstellen:

1. Öffnen Sie die [Amazon-IVS-Konsole](https://console.aws.amazon.com/ivs).

   (Sie können auf die Amazon IVS Konsole auch über die [AWS-Managementkonsole](https://console.aws.amazon.com/) zugreifen.)

1. Wählen Sie im linken Navigationsbereich **Stage** und dann **Stage erstellen** aus. Das Fenster **Stage erstellen** wird angezeigt.  
![\[Verwenden Sie das Fenster „Stage erstellen“, um eine neue Stage und ein Teilnehmer-Token dafür zu erstellen.\]](http://docs.aws.amazon.com/de_de/ivs/latest/LowLatencyUserGuide/images/Create_Stage_Console_IPR.png)

1. Geben Sie optional einen **Stagenamen** ein. Wählen Sie **Stage erstellen** aus, um die Stage zu erstellen. Die Seite mit den Stagedetails für die neue Stage wird angezeigt.

1. Wählen Sie **Teilnehmer-Token erstellen** aus.

1. Geben Sie im Dialogfeld **Teilnehmer-Token erstellen** eine Benutzer-ID ein und wählen Sie **Teilnehmer-Token erstellen** aus. Das Token wird oben in der Tabelle mit den **Teilnehmer-Token** angezeigt. Klicken Sie auf das Symbol „Token kopieren“ (links neben dem Teilnehmer-Token), um das Token zu kopieren.

## CLI-Anweisungen
<a name="multiple-hosts-setup-cli"></a>

Die Verwendung von AWS CLI ist eine Advanced Option und erfordert, dass Sie zuerst die CLI auf Ihrem Computer herunterladen und konfigurieren. Informationen zu den ersten Schritten finden Sie im [Benutzerhandbuch für die AWS-Befehlszeilenschnittstelle](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html).

Nun können Sie mit der CLI Ressourcen erstellen und verwalten. Die Stage-API befindet sich unter dem Namespace ivs-realtime. Beispiel zum Erstellen einer Stage:

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

Die Antwort ist:

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

Zum Erstellen eines Teilnehmertokens für diese Stage:

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

Die Antwort ist:

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

# Übertragung einer Stage: clientseitige im Vergleich zu serverseitige Zusammensetzung
<a name="multiple-hosts-broadcasting-client-vs-server"></a>

Wenn Entwickler eine Stage an einen IVS-Kanal übertragen möchten, haben sie zwei Möglichkeiten:
+ Bei der *clientseitigen Zusammensetzung* stellt ein Host eine Verbindung zu einer Stage her, lädt Videos von anderen Hosts herunter, kombiniert sie zu einem Stream und sendet den gemischten Stream an einen IVS-Kanal. Dieser Ansatz ermöglicht ein hohes Maß an Layout-Flexibilität: Der App-Entwickler kann das Erscheinungsbild der Zusammensetzung mithilfe der Mixer-API steuern. Allerdings erfordert die clientseitige Zusammensetzung mehr Client-CPU-Ressourcen zum Erstellen der Zusammensetzung und mehr Bandbreite, um sie zu übertragen. Wenn der Host, der die Stage überträgt, Netzwerkprobleme hat, können diese möglicherweise den Live-Stream für die Zuschauer beeinträchtigen.

  Die clientseitige Zusammensetzung ist die bevorzugte Wahl, wenn Benutzer eine hochgradig personalisierte Ansicht der übertragenen Inhalte benötigen, z. B. durch die Einbindung von Überlagerungselementen und die Anpassung von Elementen, die nicht mit der serverseitigen Zusammensetzung kompatibel sind.
+ Bei der *serverseitigen Zusammensetzung* verlagern Clients die Zusammensetzung und Übertragung einer IVS-Stage an einen Cloud-Service. Die serverseitige Zusammensetzung und RTMP-Übertragung an einen Kanal werden über Vorgänge der IVS-Steuerebene in der Heimatregion der Stage aufgerufen. Die serverseitige Zusammensetzung bietet zahlreiche Vorteile und ist daher eine attraktive Wahl für Benutzer, die effizientes und zuverlässiges Live-Streaming suchen.
  + **Reduzierte Client-Last** – Bei der serverseitigen Zusammensetzung wird die Last der Kombination von Audio- und Videoquellen von einzelnen Client-Geräten auf den Server selbst verlagert. Durch die serverseitige Zusammensetzung entfällt die Anforderung, dass Client-Geräte ihre CPU- und Netzwerkressourcen für die Zusammensetzung der Anzeige und deren Übertragung an IVS verwenden.
  + **Ausfallsicherheit** – Durch die Zentralisierung des Zusammensetzungsprozesses auf dem Server wird die Übertragung stabiler. Selbst wenn ein Gerät des Publishers technische Einschränkungen oder Netzwerkschwankungen aufweist, kann sich der Server anpassen und einen reibungsloseren Stream für alle Zuschauer bereitstellen.
  + **Bandbreiteneffizienz** – Da der Server die Zusammensetzung übernimmt, müssen Stage-Publisher keine zusätzliche Bandbreite für die Übertragung des Videos an einen IVS-Kanal aufwenden.

Weitere Informationen finden Sie unter [Serverseitige Zusammensetzung](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html) im *IVS-Echtzeit-Benutzerhandbuch*.

# Demo für mehrere Hosts in IVS
<a name="multiple-hosts-demo"></a>

Szenario: Alice (A) überträgt etwas auf ihrem Amazon-IVS-Kanal und möchte Bob (B) als Gast auf die Stage einladen. (In einem echten Broadcast wären A und B Bilder von Alice und Bob.)

![\[Demo-Szenario: Alice (A) überträgt etwas auf ihrem Amazon-IVS-Kanal und möchte Bob (B) als Gast auf die Stage einladen.\]](http://docs.aws.amazon.com/de_de/ivs/latest/LowLatencyUserGuide/images/Demo_Intro.png)


## 1. Erstellen einer Stage
<a name="multiple-hosts-demo-create-stage"></a>

Hier folgt eine [CreateStage](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStage.html)-Anfrage über die Amazon-IVS-Stage-API:

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

Genau wie hier können Sie beim Erstellen einer Stage vorab Teilnehmertoken erstellen. Außerdem können Sie Token für eine bestehende Stage erstellen, indem Sie [createParticipantToken](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateParticipantToken.html) aufrufen. Für jeden Teilnehmer können Sie eine benutzerdefinierte `userId` und eine Reihe von `attributes` übergeben. (**Wichtig**: Die Anfragefelder `attributes` und `userId` sind für alle Teilnehmer der Stage sichtbar. Daher sollten sie nicht für personenbezogene, vertrauliche oder sensible Informationen verwendet werden.)

Hier folgt die Netzwerkantwort auf die obige Anfrage:

```
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. Verteilen von Teilnehmertoken
<a name="multiple-hosts-demo-distribute-tokens"></a>

Der Client verfügt jetzt über ein Token für Alice (A) und Bob (B). Standardmäßig sind Token 1 Stunde lang gültig. Optional können Sie beim Erstellen der Stage eine benutzerdefinierte `duration` übergeben. Token können für den Beitritt zu einer Stage verwendet werden. 

![\[So verteilen Sie Token von Ihrem Server an alle Clients (z. B. über einen WebSocket-Kanal). Diese Funktionalität wird von uns nicht bereitgestellt.\]](http://docs.aws.amazon.com/de_de/ivs/latest/LowLatencyUserGuide/images/Demo_Distribute_Participant_Token_crop.png)


Sie benötigen eine Möglichkeit, um Token von Ihrem Server an alle Clients zu verteilen (z. B. über einen WebSocket-Kanal). Diese Funktionalität wird von uns nicht bereitgestellt.

## 3. Beitreten zur Stage
<a name="multiple-hosts-demo-join-stage"></a>

Unter Android oder iOS können die Teilnehmer über das Amazon IVS Broadcast SDK der Stage beitreten. Die Videoqualität lässt sich für jeden Teilnehmer konfigurieren. Hier zeigen wir, wie Alice als Erste der Stage betritt.

Hier folgt eine Übersicht über die Architektur:

![\[Unter Android oder iOS können die Teilnehmer über das Amazon-Broadcast-SDK der Stage beitreten. Hier zeigen wir, wie Alice als Erste der Stage betritt.\]](http://docs.aws.amazon.com/de_de/ivs/latest/LowLatencyUserGuide/images/Demo_Join_the_Stage_crop.png)


Und hier folgt ein Android-Codebeispiel für den Beitritt zur Stage. Das folgende Code-Snippet würde auf Alice’ Gerät ausgeführt werden. Im Aufruf von `join()` tritt Alice der Stage bei. Die obige Abbildung zeigt das Ergebnis dieser Codeausführung: Alice ist der Stage beigetreten und veröffentlicht dort etwas (zusätzlich zur Übertragung auf ihrem Kanal, womit sie im 1. Schritt begonnen hat).

```
// 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. Übertragen der Stage
<a name="multiple-hosts-demo-broadcast-stage"></a>

### Clientseitige Zusammensetzung
<a name="demo-broadcast-stage-client-side"></a>

![\[Übertragung der Stage: clientseitige Zusammensetzung.\]](http://docs.aws.amazon.com/de_de/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_1_crop.png)


Hier folgt ein Android-Codebeispiel für die Übertragung der Stage:

```
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
}
```

Die Amazon IVS Broadcast SDKs für Android und iOS verfügen über Callbacks, die vom Status der Teilnehmer ausgelöst werden (z. B. `onStreamsAdded` und `onStreamsRemoved`). Damit wird die Entwicklung einer dynamischen Benutzeroberfläche vereinfacht. Dies wird im ersten Teil des Codebeispiels veranschaulicht: Wenn Bobs Video und Audio verfügbar sind, wird Alice per `onStreamsAdded`-Callback benachrichtigt.

Anschließend kann Alice Bobs Video und Audio dem Mixer hinzufügen, um sie in den RTMP-Broadcast für das breitere Publikum ihres Kanals aufzunehmen. Dies wird im Rest des Codebeispiels veranschaulicht.

Nun überträgt Alice etwas an mehrere Zuschauer, und zwar über das Amazon IVS Broadcast SDK für Android. Die Architektur dafür sieht wie folgt aus:

![\[Übertragung der Stage: clientseitige Zusammensetzung. Alice überträgt etwas an mehrere Zuschauer.\]](http://docs.aws.amazon.com/de_de/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_2_crop.png)


### Serverseitige Zusammensetzung
<a name="demo-broadcast-stage-server-side"></a>

Zum Vergleich sehen Sie hier, wie die [serverseitige Zusammensetzung](multiple-hosts-broadcasting-client-vs-server.md) funktioniert. Weitere Informationen finden Sie unter [Serverseitige Zusammensetzung](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html) im *IVS-Echtzeit-Benutzerhandbuch*.

![\[Übertragung der Stage: serverseitige Zusammensetzung.\]](http://docs.aws.amazon.com/de_de/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Server_Side_Composition.png)
