

# Abilitazione di host multipli su un flusso Amazon IVS
<a name="multiple-hosts"></a>

Amazon Interactive Video Service (IVS) consente agli sviluppatori di creare applicazioni che combinano i video e l'audio di più emittenti (definiti anche *host* )in un flusso dal vivo.

I casi d'uso includono:
+ Posti ospiti: le emittenti possono invitare gli spettatori alla trasmissione. Questo apre le porte a contenuti collaborativi come karaoke e sessioni di domande e risposte.
+ Modalità confronto (VS): le emittenti vengono abbinate tra loro per competere (ad esempio, in una gara canora).
+ Trasmissioni di gruppo: più oratori possono conversare tra loro davanti a un vasto pubblico.

Per aggiungere più emittenti a uno streaming live, è necessario utilizzare sia lo streaming in tempo reale IVS che lo streaming a bassa latenza IVS. Lo streaming in tempo reale IVS viene utilizzato per combinare streaming video e audio mentre lo streaming a bassa latenza per trasmettere lo streaming combinato agli spettatori.

Lo streaming in tempo reale fornisce una risorsa chiamata stage, uno spazio virtuale in cui gli emittenti (host) possono scambiarsi audio e video in tempo reale. Puoi quindi trasmettere uno stage sui canali per raggiungere un pubblico più vasto e creare applicazioni in cui i membri del pubblico possano essere portati "sul palco" per contribuire alla conversazione dal vivo.

Per ulteriori informazioni sullo streaming in tempo reale IVS, consulta:
+ [Guida per l'utente dello streaming in tempo reale IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/what-is.html)
  + Gli SDK di trasmissione IVS incorporano la funzionalità in tempo reale. Consulta le guide per questi SDK: [Web](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-web.html), [Android](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-android.html) e [iOS](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast-ios.html), in particolare le sezioni su "Pubblicazione e sottoscrizione". 
+  [Riferimento all'API di streaming in tempo reale IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html)

# Nozioni di base sugli host multipli in IVS
<a name="multiple-hosts-getting-started"></a>

Questo documento illustra i passaggi necessari per iniziare a utilizzare più host in Amazon IVS.

## Istruzioni per la console
<a name="multiple-hosts-setup-console"></a>

Per creare un nuova fase e il relativo token per i partecipanti, utilizza la seguente procedura:

1. Aprire la [console Amazon IVS](https://console.aws.amazon.com/ivs).

   È possibile accedere alla console Amazon IVS anche dalla [Console di gestione AWS](https://console.aws.amazon.com/).

1. Nel riquadro di navigazione a sinistra, seleziona **Fase**, quindi seleziona **Crea fase**. Viene visualizzata la finestra **Crea fase**.  
![\[Utilizza la finestra Crea fase per creare un nuova fase e un token per i partecipanti.\]](http://docs.aws.amazon.com/it_it/ivs/latest/LowLatencyUserGuide/images/Create_Stage_Console_IPR.png)

1. Facoltativamente, inserisci un **Nome fase**. Seleziona **Crea fase** per creare la fase. Viene visualizzata la pagina dei dettagli della fase relativa al nuova fase.

1. Seleziona **Crea un token per i partecipanti**.

1. Nella finestra di dialogo **Crea un token per i partecipanti**, inserisci un ID utente e seleziona **Crea un token per i partecipanti**. Il token viene visualizzato nella parte superiore della tabella **Token per i partecipanti**. Fai clic sull'icona "Copia token" (a sinistra del token per i partecipanti) per copiare il token.

## Istruzioni per la CLI
<a name="multiple-hosts-setup-cli"></a>

L'uso di AWS CLI è un'opzione avanzata e richiede prima il download e la configurazione della CLI sul computer. Per maggiori dettagli, consultare la [Guida per l'utente dell'interfaccia a riga di comando di AWS](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html).

Ora puoi usare la CLI per creare e gestire le risorse. L'API della fase si trova nello spazio dei nomi ivs-realtime. Ad esempio, per creare uno stage:

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

La risposta è:

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

Per creare un token di partecipazione per quello stage:

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

La risposta è:

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

# Trasmissione di una fase: composizione lato client e composizione lato server
<a name="multiple-hosts-broadcasting-client-vs-server"></a>

Quando gli sviluppatori vogliono trasmettere una fase su un canale IVS, hanno due possibilità:
+ Con la *composizione lato client*, un host si connette a una fase, scarica video da altri host, li combina in un unico streaming e trasmette lo streaming misto su un canale IVS. Questo approccio consente un elevato grado di flessibilità di layout: lo sviluppatore dell'app può controllare l'aspetto della composizione utilizzando l'API mixer. Tuttavia, la composizione lato client richiede più risorse della CPU client per creare la composizione e una maggiore larghezza di banda per trasmetterla. Inoltre, se l'host che trasmette la fase ha problemi di rete, questi potrebbero influire sullo streaming live per gli spettatori.

  La composizione lato client è la scelta preferita quando gli utenti necessitano di una visualizzazione altamente personalizzata del contenuto trasmesso, ad esempio incorporando sovrapposizioni e personalizzando elementi non compatibili con la composizione lato server.
+ Con la *composizione lato server* i client affidano la composizione e la trasmissione di una fase IVS a un servizio cloud. La composizione lato server e la trasmissione RTMP a un canale vengono richiamate tramite operazioni del piano di controllo (control-plane) IVS nella regione di origine della fase. La composizione lato server offre numerosi vantaggi, rendendola una scelta interessante per gli utenti che cercano uno streaming live efficiente e affidabile.
  + **Carico client ridotto**: con la composizione lato server, l'onere della combinazione di sorgenti audio e video viene spostato dai singoli dispositivi client al server stesso. La composizione lato server elimina la necessità per i dispositivi client di utilizzare la CPU e le risorse di rete per comporre la vista e trasmetterla a IVS.
  + **Resilienza**: centralizzando il processo di composizione sul server, la trasmissione diventa più solida. Anche se per un dispositivo del publisher si presentano limitazioni tecniche o fluttuazioni di rete, il server può adattarsi e fornire uno streaming più fluido a tutto il pubblico.
  + **Efficienza della larghezza di banda**: poiché il server gestisce la composizione, i publisher della fase non devono spendere una larghezza di banda aggiuntiva per trasmettere il video a IVS.

Per ulteriori informazioni, consulta [Composizione lato server](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html) nella *Guida per l'utente dello streaming in tempo reale di IVS*.

# Demo di più host in IVS
<a name="multiple-hosts-demo"></a>

Scenario: Alice (A) sta trasmettendo sul suo canale Amazon IVS e vuole invitare Bob (B) sul palco come ospite. (In una trasmissione reale, A e B sarebbero immagini di Alice e Bob.)

![\[Scenario dimostrativo: Alice (A) sta trasmettendo sul suo canale Amazon IVS e vuole invitare Bob (B) sul palco come ospite.\]](http://docs.aws.amazon.com/it_it/ivs/latest/LowLatencyUserGuide/images/Demo_Intro.png)


## 1. Creazione di uno stage
<a name="multiple-hosts-demo-create-stage"></a>

Ecco una richiesta [CreateStage](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStage.html) che utilizza l'API di fase Amazon IVS:

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

Puoi pre-creare i token di partecipazione quando crei uno stage, come viene fatto qui. Puoi anche creare token per uno stage esistente, chiamando [CreateParticipantToken](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateParticipantToken.html). Per ogni partecipante, puoi fornire un `userId` personalizzato e un set di `attributes`. (**Importante**: i campi obbligatori `attributes` e `userId` sono mostrati a tutti i partecipanti della fase. Non devono essere utilizzati per l'identificazione personale o di informazioni riservate o sensibili).

Ecco la risposta di rete alla richiesta precedente:

```
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. Distribuzione dei token di partecipazione
<a name="multiple-hosts-demo-distribute-tokens"></a>

Il client ora ha un token per Alice (A) e Bob (B). Per impostazione predefinita, i token sono validi per 1 ora; facoltativamente puoi aggiungere un `duration` personalizzato quando crei lo stage. I token possono essere usati per accedere a uno stage. 

![\[Come distribuire i token dal server a ciascun client (ad esempio, tramite un canale WebSocket). Questa funzionalità non è disponibile.\]](http://docs.aws.amazon.com/it_it/ivs/latest/LowLatencyUserGuide/images/Demo_Distribute_Participant_Token_crop.png)


Avrai bisogno di un modo per distribuire i token dal server a ciascun client (ad esempio, tramite un canale WebSocket). Questa funzionalità non è disponibile.

## 3. Accesso allo stage
<a name="multiple-hosts-demo-join-stage"></a>

I partecipanti possono accedere allo stage tramite l'SDK di trasmissione Amazon IVS su Android o iOS. Puoi configurare la qualità video di ogni partecipante. Qui mostriamo Alice che accede per prima allo stage.

Ecco una panoramica dell'architettura:

![\[I partecipanti possono accedere allo stage tramite l'SDK di trasmissione Amazon su Android o iOS. Qui mostriamo Alice che accede per prima allo stage.\]](http://docs.aws.amazon.com/it_it/ivs/latest/LowLatencyUserGuide/images/Demo_Join_the_Stage_crop.png)


Ed ecco un esempio di codice Android per accedere allo stage. Il frammento di codice riportato di seguito verrebbe eseguito sul dispositivo di Alice. Nella chiamata `join()`, Alice accede allo stage. La figura sopra mostra il risultato di questa esecuzione del codice: Alice ha effettuato l'accesso allo stage e sta pubblicando (oltre a trasmettere sul suo canale, cosa che ha iniziato a fare nel passaggio 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. Trasmissione della fase
<a name="multiple-hosts-demo-broadcast-stage"></a>

### Composizione lato client
<a name="demo-broadcast-stage-client-side"></a>

![\[Trasmissione della fase: composizione lato client.\]](http://docs.aws.amazon.com/it_it/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_1_crop.png)


Ecco un esempio di codice Android per trasmettere lo 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
}
```

Gli SDK di trasmissione Amazon IVS per Android e iOS hanno callback attivati dallo stato dei partecipanti (ad esempio `onStreamsAdded` e `onStreamsRemoved`), per semplificare la creazione di un'interfaccia utente dinamica. Questo è mostrato nella prima parte dell'esempio di codice: quando il video e l'audio di Bob sono disponibili, Alice riceve una notifica tramite un callback `onStreamsAdded`.

Alice può quindi aggiungere il video e l'audio di Bob al mixer da includere nella trasmissione RTMP per il pubblico più ampio del suo canale. Questo è mostrato nel resto dell'esempio di codice.

Ora Alice trasmette a più spettatori tramite l'SDK di trasmissione di Amazon IVS per Android. Ecco come si presenta dal punto di vista dell'architettura:

![\[Trasmissione della fase: composizione lato client. Alice trasmette a più spettatori.\]](http://docs.aws.amazon.com/it_it/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_2_crop.png)


### Composizione lato server
<a name="demo-broadcast-stage-server-side"></a>

Per fare un confronto, ecco come funziona la [composizione lato server](multiple-hosts-broadcasting-client-vs-server.md). Per ulteriori informazioni, consulta [Composizione lato server](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html) nella *Guida per l'utente dello streaming in tempo reale di IVS*.

![\[Trasmissione della fase: composizione lato server.\]](http://docs.aws.amazon.com/it_it/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Server_Side_Composition.png)
