

# Habilitación de varios hosts en una transmisión de Amazon IVS
<a name="multiple-hosts"></a>

Amazon Interactive Video Service (IVS) permite a los desarrolladores crear aplicaciones que combinan audio y video de varios emisores (también conocidos como *hosts*) en una transmisión en directo.

Los casos de uso incluyen los siguientes:
+ Espacios para invitados: los emisores pueden invitar a los espectadores a la transmisión. Esto permite que haya contenido colaborativo, como karaoke y sesiones de preguntas y respuestas.
+ Modo Versus (VS): los emisores se emparejan entre sí para competir (por ejemplo, en una competencia de canto).
+ Transmisiones grupales: varios oradores pueden conversar entre sí frente a una gran audiencia.

Para agregar varios emisores a una transmisión en directo, debe utilizar tanto la transmisión en tiempo real de IVS como el de baja latencia. La transmisión en tiempo real de IVS se usa para combinar transmisiones de video y audio, mientras que la de baja latencia es para distribuir la transmisión combinada a los espectadores.

La transmisión en tiempo real proporciona un recurso llamado “escenario”, un espacio virtual donde los emisores (hosts) pueden intercambiar audio y video en tiempo real. A continuación, puede transmitir un escenario a los canales con el objetivo de llegar a una audiencia más amplia. También puede crear aplicaciones en las que los miembros de la audiencia se puedan “subir al escenario” para contribuir a la conversación en directo.

Para obtener más información sobre la transmisión en tiempo real de IVS, consulte:
+ [Guía del usuario de la transmisión en tiempo real de IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/what-is.html)
  + Los SDK de transmisión de IVS existentes incorporan la funcionalidad en tiempo real. Consulta las guías de esos 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), especialmente las secciones sobre publicación y suscripción. 
+  [Referencia de la API de transmisión en tiempo real de IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html)

# Introducción a varios hosts en IVS
<a name="multiple-hosts-getting-started"></a>

En este documento, se explican los pasos para comenzar a usar varios hosts en Amazon IVS.

## Instrucciones de la consola
<a name="multiple-hosts-setup-console"></a>

Para crear una nueva fase y un token de participante para ella, siga estos pasos:

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

   (También puede obtener acceso a la consola de Amazon IVS mediante la [consola de administración de AWS](https://console.aws.amazon.com/)).

1. En el panel de navegación de la izquierda, selecciona **Fases** y, a continuación, seleccione **Crear fase**. Aparece la ventana **Crear fase**.  
![\[Utilice la ventana Crear fase para crear una nueva fase y un token de participante para ella.\]](http://docs.aws.amazon.com/es_es/ivs/latest/LowLatencyUserGuide/images/Create_Stage_Console_IPR.png)

1. Si lo desea, ingrese un **nombre para la fase**. Seleccione **Crear fase** para crear la fase. Aparece la página de detalles de la nueva fase.

1. Seleccione **Crear un token de participante**.

1. En el cuadro de diálogo **Crear un token de participante**, ingrese un ID de usuario y seleccione **Crear un token de participante**. El token aparece en la parte superior de la tabla **Tokens de participantes**. Haga clic en el ícono “Copiar token” (situado a la izquierda del token de participante) para copiarlo.

## Instrucciones de la CLI
<a name="multiple-hosts-setup-cli"></a>

El uso de la CLI de AWS es una opción avanzada y requiere que primero descargue y configure la CLI en su equipo. Para obtener más información, consulte la [Guía del usuario de la interfaz de línea de comandos de AWS](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html).

Ahora puede utilizar la CLI para crear y administrar recursos. La API de escenarios se encuentra en el espacio de nombres ivs-realtime. Por ejemplo, para crear un escenario:

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

La respuesta es:

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

Para crear un token de participante para ese escenario, siga estos pasos:

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

La respuesta es:

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

# Transmisión de un escenario: composición del cliente versus composición del servidor
<a name="multiple-hosts-broadcasting-client-vs-server"></a>

Cuando los desarrolladores quieren transmitir un escenario a un canal IVS, tienen dos opciones:
+ Con la *composición del cliente*, un host se conecta a un escenario, descarga videos de otros hosts, los combina en una sola transmisión y transmite la transmisión mixta a un canal de IVS. Este enfoque permite un alto grado de flexibilidad de diseño: el desarrollador de la aplicación puede controlar el aspecto de la composición mediante la API del mezclador. Sin embargo, la composición del cliente requiere más recursos de CPU del cliente para crear la composición y más ancho de banda para transmitirla. Además, si el host que está transmitiendo el escenario tiene problemas con la red, estos pueden afectar la transmisión en directo para los espectadores.

  La composición del cliente es la opción preferida cuando los usuarios necesitan una visión altamente personalizada del contenido de la transmisión, por ejemplo, incorporando superposiciones y personalizando elementos que no son compatibles con la composición del servidor.
+ Con la *composición del servidor*, los clientes transfieren la composición y la transmisión de un escenario de IVS a un servicio en la nube. La composición del servidor y la transmisión RTMP a un canal se invocan a través de las operaciones del plano de control del IVS en la región de origen de la fase. La composición del servidor ofrece numerosas ventajas, lo que la convierte en una opción atractiva para los usuarios que buscan una transmisión en directo eficiente y fiable.
  + **Reducción de la carga de clientes**: con la composición del servidor, la carga de combinar fuentes de audio y video pasa de los dispositivos cliente individuales al propio servidor. La composición del servidor elimina la necesidad de que los dispositivos cliente utilicen sus recursos de CPU y red para componer la vista y transmitirla al IVS.
  + **Resiliencia**: al centralizar el proceso de composición en el servidor, la transmisión se vuelve más sólida. Incluso si el dispositivo de un publicador experimenta limitaciones técnicas o fluctuaciones en la red, el servidor puede adaptarse y ofrecer una transmisión más fluida a toda la audiencia.
  + **Eficiencia del ancho de banda**: dado que el servidor se encarga de la composición, los publicadores de escenario no tienen que gastar más ancho de banda para transmitir el video a un canal IVS.

Para obtener más información, consulte [Composición del servidor](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html) en la *Guía del usuario de IVS en tiempo real*.

# Demostración de varios hosts en IVS
<a name="multiple-hosts-demo"></a>

Situación: Alice (A) está transmitiendo en su canal de Amazon IVS y quiere invitar a Bob (B) al escenario. (En una transmisión real, A y B serían imágenes de Alice y Bob).

![\[Situación de demostración: Alice (A) está transmitiendo en su canal de Amazon IVS y quiere invitar a Bob (B) al escenario.\]](http://docs.aws.amazon.com/es_es/ivs/latest/LowLatencyUserGuide/images/Demo_Intro.png)


## 1. Creación de un escenario
<a name="multiple-hosts-demo-create-stage"></a>

Esta es una solicitud [CreateStage](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStage.html) que se hace con la API de fases de Amazon IVS:

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

Puede crear previamente los tokens de participante al crear un escenario, como se hace aquí. También puede crear tokens de un escenario existente llamando a [CreateParticipantToken](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateParticipantToken.html). Para cada participante, puede enviar un `userId` personalizado y un conjunto de `attributes`. (**Importante**: Los campos de las solicitudes `attributes` y `userId` están expuestos a todos los participantes del escenario. Estos datos no se deben utilizar en la información de identificación personal o confidencial).

Esta es la respuesta de la red a la solicitud anterior:

```
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. Distribución de los tokens de participante
<a name="multiple-hosts-demo-distribute-tokens"></a>

El cliente ahora tiene un token para Alice (A) y Bob (B). De forma predeterminada, los tokens son válidos durante 1 hora. Si lo desea, puede incluir una `duration` personalizada al crear el escenario. Los tokens se pueden usar para incorporarse a un escenario. 

![\[Cómo distribuir los tokens de su servidor a cada cliente (por ejemplo, a través de un canal de WebSocket). No ofrecemos esta funcionalidad.\]](http://docs.aws.amazon.com/es_es/ivs/latest/LowLatencyUserGuide/images/Demo_Distribute_Participant_Token_crop.png)


Necesitará distribuir los tokens de su servidor a cada cliente (por ejemplo, a través de un canal de WebSocket). No ofrecemos esta funcionalidad.

## 3. Incorporación al escenario
<a name="multiple-hosts-demo-join-stage"></a>

Los participantes pueden incorporarse al escenario a través del SDK de transmisión de Amazon IVS en Android o iOS. Puede configurar la calidad de video de cada participante. Aquí se puede ver a Alice incorporándose primero al escenario.

A continuación, se muestra una descripción general de la arquitectura:

![\[Los participantes pueden incorporarse al escenario a través del SDK de transmisión de Amazon en Android o iOS. Aquí se puede ver a Alice incorporándose primero al escenario.\]](http://docs.aws.amazon.com/es_es/ivs/latest/LowLatencyUserGuide/images/Demo_Join_the_Stage_crop.png)


Y aquí hay un ejemplo de código de Android para incorporarse al escenario. El siguiente fragmento de código se ejecutaría en el dispositivo de Alice. En la llamada a `join()`, Alice se incorpora al escenario. La figura anterior muestra el resultado de la ejecución de este código: Alice se ha incorporado al escenario y publica en él (además de transmitir en su canal, cosa que empezó a hacer en el paso 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. Transmisión del escenario
<a name="multiple-hosts-demo-broadcast-stage"></a>

### Composición del cliente
<a name="demo-broadcast-stage-client-side"></a>

![\[Transmitiendo el escenario: composición del cliente.\]](http://docs.aws.amazon.com/es_es/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_1_crop.png)


Este es un ejemplo de código de Android para transmitir el escenario:

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

Los SDK de transmisión de Amazon IVS para Android e iOS tienen devoluciones de llamada activadas en función del estado de los participantes (por ejemplo, `onStreamsAdded` y `onStreamsRemoved`), para simplificar la creación de una interfaz de usuario dinámica. Esto se muestra en la primera parte del ejemplo de código: cuando el video y el audio de Bob están disponibles, Alice recibe una notificación mediante una devolución de llamada `onStreamsAdded`.

Luego, Alice puede agregar el video y audio de Bob al mezclador para incluirlos en la transmisión RTMP para la audiencia más amplia de su canal. Esto se muestra en el resto del ejemplo de código.

Ahora Alice transmite a varios espectadores a través del SDK de transmisión de Amazon IVS para Android. Así es como se ve desde el punto de vista arquitectónico:

![\[Transmisión del escenario: composición del cliente. Alice está transmitiendo para varios televidentes.\]](http://docs.aws.amazon.com/es_es/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Client_Side_Composition_2_crop.png)


### Composición del servidor
<a name="demo-broadcast-stage-server-side"></a>

A modo de comparación, así es como funciona la [composición del servidor](multiple-hosts-broadcasting-client-vs-server.md). (Para obtener más información, consulte la [Composición del servidor](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/server-side-composition.html) en la *Guía del usuario en tiempo real de IVS*).

![\[Transmisión del escenario: composición del servidor.\]](http://docs.aws.amazon.com/es_es/ivs/latest/LowLatencyUserGuide/images/Demo_Broadcast_the_Stage_Server_Side_Composition.png)
