

# Grabación de IVS \$1 Transmisión en tiempo real
<a name="rt-recording"></a>

Existen dos opciones de grabación para Transmisión en tiempo real de IVS:
+ Con la grabación de participantes individuales, el contenido multimedia de cada publicador se graba en archivos independientes.
+ Por el contrario, la grabación compuesta combina contenido multimedia de todos los publicadores en una sola vista y lo graba en un solo archivo.

La grabación de participantes individuales no conlleva cargos adicionales de Amazon IVS, mientras que la grabación compuesta conlleva cargos según la tarifa por hora del video codificado. Ambas opciones de grabación conllevan los cargos estándar de almacenamiento y solicitud de S3. Para obtener más información, consulte [Precios de Amazon IVS](https://aws.amazon.com/ivs/pricing/).

Si busca una solución más personalizable, considere utilizar el proyecto [IVSStageSaver](https://github.com/aws-samples/amazon-ivs-stage-recorder) de código abierto como base para su propio servicio de grabación alojado por cuenta propia.

## Grabación de participantes individuales
<a name="ind-par-rec"></a>

Esta opción es ideal para transmisiones en directo con un solo publicador o cuando se necesitan grabaciones independientes de cada publicador, especialmente con fines de moderación. Para obtener más información, consulte [Grabación de participantes individuales](rt-individual-participant-recording.md).

![\[Grabación del contenido multimedia de cada publicador en un archivo independiente mediante la grabación de participantes individuales.\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## Grabación compuesta
<a name="comp-rec"></a>

Esta opción combina contenido multimedia de varios publicadores en una sola vista y lo graba en un solo archivo, lo que resulta ideal para disfrutar de una experiencia de video bajo demanda. Para obtener más información, consulte [Grabación compuesta](rt-composite-recording.md).

![\[Grabación de un escenario en un bucket de S3 mediante la composición del servidor.\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/images/Composite_Recording.png)


## Miniaturas
<a name="thumbnails"></a>

La grabación de miniaturas para la transmisión en tiempo real de IVS se puede configurar tanto para grabaciones de participantes individuales como para grabaciones compuestas (con múltiples participantes). Para habilitar o desactivar la grabación de miniaturas y ajustar el intervalo en el que se generan las miniaturas:
+ Para las grabaciones de participantes individuales, utilice la propiedad `thumbnailConfiguration`.
+ Para las grabaciones compuestas, utilice la propiedad `thumbnailConfigurations`.

Los intervalos de miniaturas varían entre 1 y 86 400 segundos (24 horas); de forma predeterminada, la grabación de miniaturas está desactivada. Para obtener más detalles, consulte la [Referencia de la API de Transmisión en tiempo real de Amazon IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html).

La configuración de miniaturas incluye un campo `storage`, que se puede configurar en `SEQUENTIAL` o `LATEST`. El campo `storage` determina el comportamiento de almacenamiento en S3 de las miniaturas:
+ `SEQUENTIAL` guarda todas las miniaturas en serie. Esta es la opción predeterminada.
+ `LATEST` guarda solo la miniatura más reciente y sobrescribe la anterior.

Si especifica tanto `SEQUENTIAL` como `LATEST`, las miniaturas se escriben en dos rutas de S3 distintas, una para el archivo secuencial y otra para la miniatura más reciente.

# Grabación de participantes individuales en IVS \$1 Transmisión en tiempo real
<a name="rt-individual-participant-recording"></a>

Este documento explica cómo utilizar la grabación de participantes individuales con la transmisión en tiempo real de IVS.

Se aplican los costos estándar de almacenamiento y solicitudes de S3. Las miniaturas no generan cargos adicionales de IVS. Para obtener más información, consulte [Precios de Amazon IVS](https://aws.amazon.com/ivs/pricing/).

## Introducción
<a name="ind-part-rec-introduction"></a>

La grabación de participantes individuales permite a los clientes de IVS que transmiten en tiempo real grabar a los publicadores de fases de IVS de forma individual en buckets de S3. Cuando una fase permite la grabación de participantes individuales, el contenido del publicador se graba cuando este comienza a publicar en la fase.

**Nota:** Si necesita mezclar a todos los participantes de la fase en un solo video, la característica de grabación compuesta es la más adecuada. Consulte [Grabación](rt-recording.md) para ver un resumen de la grabación de contenido de transmisión en tiempo real de IVS.

![\[Grabación del contenido multimedia de cada publicador en un archivo independiente mediante la grabación de participantes individuales.\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## Flujo de trabajo
<a name="ind-part-rec-workflow"></a>

![\[Flujo de trabajo para grabar el contenido multimedia de cada publicador en un archivo independiente mediante la grabación de participantes individuales.\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/images/Workflow_Participant_Recording.png)


### 1. Creación de S3 Bucket
<a name="ind-part-rec-create-s3-bucket"></a>

Necesitará un bucket de S3 para escribir VOD. Para obtener más información, consulte la documentación de S3 sobre [cómo crear buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html). Tenga en cuenta que, para la grabación de participantes individuales, los buckets de S3 deben crearse en la misma región de AWS que la fase de IVS.

**Importante**: Si utiliza un bucket de S3 existente:
+ La configuración **Propiedad del objeto** debe ser **Aplicada al propietario del bucket** o **Propietario del bucket preferido**.
+ La opción de **Cifrado predeterminado** debe indicar **Cifrado del lado del servidor con claves administradas por Amazon S3 (SSE-S3)**.

Para obtener más información, consulte la documentación de S3 sobre el [control de propiedad de los objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) y la [protección de datos mediante cifrado](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html).

### 2. Creación de un objeto StorageConfiguration
<a name="ind-part-rec-create-storageconfig-object"></a>

Tras crear un bucket, llame a la API de transmisión en tiempo real de IVS para [crear un objeto StorageConfiguration](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html). Una vez que la configuración de almacenamiento se haya creado correctamente, IVS tendrá permiso para escribir en el bucket de S3 proporcionado. Puede reutilizar este objeto StorageConfiguration en varias fases.

### 3. Creación de una fase con tokens de participantes
<a name="ind-part-rec-create-stage-with-part-tokens"></a>

Ahora tiene que [crear una fase de IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStage.html) con la grabación de participantes individuales habilitada (configurando el objeto AutoParticipantRecordingConfiguration), así como tokens de participantes para cada publicador.

La siguiente solicitud crea una fase con dos tokens de participantes y con la grabación de participantes individuales habilitada.

```
POST /CreateStage HTTP/1.1
Content-type: application/json

{
   "autoParticipantRecordingConfiguration": { 
      "mediaTypes": ["AUDIO_VIDEO"],
      "storageConfigurationArn": "arn:aws:ivs:us-west-2:123456789012:storage-configuration/AbCdef1G2hij",
      "thumbnailConfiguration": {
         "recordingMode": "INTERVAL",
         "storage": ["LATEST", "SEQUENTIAL"],
         "targetIntervalSeconds": 60
      }
   },
   "name": "TestStage",
   "participantTokenConfigurations": [ 
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "1"
      },
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "2"
      }
   ]
}
```

### 4. Unión a la fase como publicador activo
<a name="ind-part-rec-join-stage-as-active-pub"></a>

Distribuya los tokens de participantes entre los publicadores y haga que se unan a la fase y comiencen [a publicar en ella](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/getting-started-pub-sub.html).

Cuando se unan a la fase y comienzan a publicar en ella mediante uno de los [SDK de transmisión en tiempo real de IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast.html), el proceso de grabación de los participantes se inicia automáticamente y le envía un [evento de EventBridge](eventbridge.md) en el que se indica que la grabación ha comenzado. (El evento es Cambio en el estado de la grabación del participante de IVS: inicio de la grabación). Al mismo tiempo, el proceso de grabación de los participantes comienza a escribir los archivos de VOD y de metadatos en el bucket de S3 configurado. Nota: No se garantiza que los participantes conectados durante periodos extremadamente cortos (menos de 5 segundos) se graben.

Existen dos formas de obtener el prefijo de S3 para cada grabación:
+ Escuche el evento de EventBridge:

  ```
  {
     "version": "0",
     "id": "12345678-1a23-4567-a1bc-1a2b34567890",
     "detail-type": "IVS Participant Recording State Change",
     "source": "aws.ivs",
     "account": "123456789012",
     "time": "2024-03-13T22:19:04Z",
     "region": "us-east-1",
     "resources": ["arn:aws:ivs:us-west-2:123456789012:stage/AbCdef1G2hij"],
     "detail": {
        "session_id": "st-ZyXwvu1T2s",
        "event_name": "Recording Start",
        "participant_id": "xYz1c2d3e4f",
        "recording_s3_bucket_name": "ivs-recordings",
        "recording_s3_key_prefix": "<stage_id>/<session_id>/<participant_id>/2024-01-01T12-00-55Z"
     }
  }
  ```
+ Utilice la operación de la API [GetParticipant](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_GetParticipant.html): la respuesta incluye el bucket de S3 y el prefijo del lugar donde se graba al participante. La solicitud es la siguiente:

  ```
  POST /GetParticipant HTTP/1.1
  Content-type: application/json
  {
     "participantID": "xYz1c2d3e4f",
     "sessionId": "st-ZyXwvu1T2s",
     "stageArn": "arn:aws:ivs:us-west-2:123456789012:stage/AbCdef1G2hij"
  }
  ```

  Y esta es la respuesta:

  ```
  Content-type: application/json
  {
     "participant": {
        ...
        "recordingS3BucketName": "ivs-recordings",
        "recordingS3Prefix": "<stage_id>/<session_id>/<participant_id>",
        "recordingState": "ACTIVE",
        ...
     }
  }
  ```

### 5. Reproducción del VOD
<a name="ind-part-rec-play-back-vod"></a>

Una vez finalizada la grabación, puede verla con el [reproductor de IVS](https://debug.ivsdemos.com/?p=ivs). Consulte [Playback of Recorded Content from Private Buckets](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/rt-composite-recording.html#comp-rec-playback) para obtener instrucciones sobre cómo configurar las distribuciones de CloudFront para la reproducción de VOD.

## Grabación solo de audio
<a name="ind-part-rec-audio-only-recordings"></a>

Al configurar la grabación de un participante individual, puede elegir que solo se escriban segmentos de audio HLS en su bucket de S3. Para utilizar esta característica, elija `AUDIO_ONLY mediaType` al crear la fase:

```
POST /CreateStage HTTP/1.1
Content-type: application/json

{
   "autoParticipantRecordingConfiguration": { 
      "storageConfigurationArn": "arn:aws:ivs:us-west-2:123456789012:storage-configuration/AbCdef1G2hij",
      "mediaTypes": ["AUDIO_ONLY"],
      "thumbnailConfiguration": {
         "recordingMode": "DISABLED"
      }
   },
   "name": "TestStage",
   "participantTokenConfigurations": [ 
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "1"
      },
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "2"
      }
   ]
}
```

## Grabación solo de miniaturas
<a name="ind-part-rec-recording-thumbnail-only"></a>

Al configurar la grabación de participantes individuales, puede optar por que solo las miniaturas se escriban en el bucket de S3. Para utilizar esta característica, esablezca `mediaType` en `NONE` al crear la fase. Esto garantiza que no se generen segmentos HLS; las miniaturas se seguirán creando y escribiendo en el bucket de S3.

```
POST /CreateStage HTTP/1.1
Content-type: application/json
{
   "autoParticipantRecordingConfiguration": { 
      "storageConfigurationArn": "arn:aws:ivs:us-west-2:123456789012:storage-configuration/AbCdef1G2hij",
      "mediaTypes": ["NONE"],
      "thumbnailConfiguration": {
         "recordingMode": "INTERVAL",
         "storage": ["LATEST", "SEQUENTIAL"],
         "targetIntervalSeconds": 60
      }
   },
   "name": "TestStage",
   "participantTokenConfigurations": [ 
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "1"
      },
      { 
         "capabilities": ["PUBLISH", "SUBSCRIBE"],
         "duration": 20160,
         "userId": "2"
      }
   ]
}
```

## Grabación de contenidos
<a name="ind-part-rec-recording-contents"></a>

Cuando la grabación de participantes individuales está activa, los segmentos de video HLS, los archivos de metadatos y las miniaturas comenzarán a escribirse en el bucket de S3 proporcionado al momento de crear la fase. Este contenido está disponible para posprocesamiento o reproducción como video bajo demanda.

Tenga en cuenta que, una vez finalizada la grabación, se envía un evento Cambio en el estado de la grabación del participante de IVS: fin de la grabación a través de EventBridge. Le recomendamos que reproduzca o procese transmisiones grabadas solo después de que se reciba este evento. Para obtener más detalles, vea [Uso de EventBridge con la transmisión en tiempo real de IVS](eventbridge.md).

A continuación, se muestra una estructura de directorios de ejemplo y el contenido de una grabación de una sesión en vivo de IVS:

```
s3://mybucket/stageId/stageSessionId/participantId/timestamp
   events
      recording-started.json
      recording-ended.json
   media
      hls
	 multivariant.m3u8
         high
            playlist.m3u8
            1.mp4
      thumbnails
         high
            1.jpg
            2.jpg
      latest_thumbnail
         high
            thumb.jpg
```

La carpeta `events` contiene los archivos de metadatos correspondientes al evento de grabación. Los archivos de metadatos JSON se generan cuando la grabación se inicia, finaliza correctamente o termina con errores:
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

Una carpeta `events` contiene `recording-started.json` y `recording-ended.json` o `recording-failed.json`. Estos contienen metadatos relacionados con la sesión grabada y sus formatos de salida. Los detalles de JSON se dan a continuación.

La carpeta `media` contiene el contenido multimedia compatible. La subcarpeta `hls` contiene todos los archivos multimedia y de manifiesto generados durante la sesión de grabación y se puede reproducir con el reproductor de IVS. Si está configurado, las subcarpetas `thumbnails` y `latest_thumbnail` contienen archivos multimedia de miniaturas en formato JPEG generados durante la sesión de grabación.

## Combinación de grabaciones fragmentadas de participantes individuales
<a name="ind-part-rec-merge-frag"></a>

La propiedad `recordingReconnectWindowSeconds` de una configuración de grabación le permite especificar un periodo de tiempo (en segundos) durante el cual, si un publicador de fases se desconecta de una fase y, a continuación, se vuelve a conectar, IVS intenta grabar con el mismo prefijo de S3 que en la sesión anterior. En otras palabras, si un publicador se desconecta y, a continuación, se vuelve a conectar dentro del intervalo especificado, las múltiples grabaciones se consideran una sola grabación y se combinan.

Si la grabación de miniaturas está habilitada en el modo `SEQUENTIAL`, las miniaturas también se combinan en el mismo `recordingS3Prefix`. Cuando se combinan las grabaciones, el contador de miniaturas se reinicia a partir del valor de la miniatura anterior que se escribió para la grabación anterior.

**Eventos de cambio de estado de grabación de IVS en Amazon EventBridge:** eventos de finalización de la grabación y los archivos de metadatos JSON de grabación finalizada se retrasan al menos `recordingReconnectWindowSeconds`, ya que IVS espera para asegurarse de que no se inicie una nueva transmisión.

Para obtener instrucciones sobre cómo configurar la funcionalidad de fusión de transmisiones, consulte [Paso 2: crear una fase con grabación de participantes opcional](getting-started-create-stage.md) en *Introducción a transmisión en tiempo real de Amazon IVS*.

### Elegibilidad
<a name="ind-part-rec-merge-frag-eligibility"></a>

Para que varias grabaciones se combinen con el mismo prefijo de S3, se deben cumplir ciertas condiciones para todas las grabaciones:
+ El valor de la propiedad `recordingReconnectWindowSeconds` de AutoParticipantRecordingConfiguration para la fase se establece en un valor superior a 0.
+ El valor de `StorageConfigurationArn` utilizado para escribir los artefactos de VOD es el mismo para cada grabación.
+ La diferencia de tiempo en segundos entre el momento en que el participante abandona la fase y vuelve a entrar en ella es inferior o igual a `recordingReconnectWindowSeconds`.

Tenga en cuenta que el valor predeterminado de `recordingReconnectWindowSeconds` es 0, lo que desactiva la combinación.

## Sincronización de las grabaciones de varios participantes
<a name="ind-part-rec-sync-multiple"></a>

Las grabaciones de los participantes individuales incluyen etiquetas `EXT-X-PROGRAM-DATE-TIME` en las listas de reproducción HLS, que proporcionan marcas de tiempo UTC precisas con exactitud de milisegundos para sincronizar las grabaciones de varios participantes durante el posprocesamiento.

Cuando graba a varios participantes de manera individual y desea crear una composición sincronizada (como una vista lado a lado o imagen sobre imagen), puede usar estas marcas de tiempo para alinear las grabaciones con precisión, incluso si los participantes se unieron al escenario en momentos diferentes o experimentaron discontinuidades causadas potencialmente por interrupciones de red.

La lista de reproducción HLS de cada participante incluye etiquetas `EXT-X-PROGRAM-DATE-TIME` que marcan lo siguiente:
+ El inicio de la grabación (primer segmento).
+ Cualquier punto de discontinuidad durante la grabación, por ejemplo, cuando se reconstruye la secuencia.

Estas marcas de tiempo usan precisión de milisegundos y están sincronizadas entre todos los participantes mediante la misma referencia temporal.

### Ejemplo de lista de reproducción HLS
<a name="ind-part-rec-sync-multiple-hls-playlist"></a>

```
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:12
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init-0.mp4"
#EXT-X-PROGRAM-DATE-TIME:2024-01-01T12:00:00.000Z
#EXTINF:3.30091,
0.mp4
#EXTINF:5.63794,
1.mp4
#EXTINF:2.74290,
2.mp4
#EXT-X-DISCONTINUITY
#EXT-X-MAP:URI="init-1.mp4"
#EXT-X-PROGRAM-DATE-TIME:2024-01-01T12:00:52.772Z
#EXTINF:2.54412,
3.mp4
#EXTINF:5.63649,
4.mp4
```

Las etiquetas `EXT-X-PROGRAM-DATE-TIME` proporcionan la hora UTC exacta para el primer segmento y en cada punto de discontinuidad, lo que permite una sincronización precisa con las grabaciones de otros participantes.

### Flujo de sincronización
<a name="ind-part-rec-sync-multiple-workflow"></a>

Para sincronizar las grabaciones de varios participantes, extraiga las marcas de tiempo `EXT-X-PROGRAM-DATE-TIME` de la lista de reproducción HLS de cada participante y utilícelas para calcular los desfases temporales. Estos desfases pueden aplicarse luego durante la composición en la fase posterior al procesamiento mediante herramientas de procesamiento de video como FFmpeg. Cuando existen discontinuidades en las grabaciones, las marcas de tiempo en esos puntos proporcionan las referencias temporales necesarias para mantener una sincronización precisa a lo largo de toda la grabación.

Nota: Para obtener una salida sincronizada en tiempo real sin posprocesamiento, considere usar la composición del servidor en lugar de la grabación individual de participantes.

## Archivos de metadatos JSON
<a name="ind-part-rec-json-metadata-files"></a>

Estos metadatos están en formato JSON. Contiene la siguiente información: 


| Campo | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
| `stage_arn` | string | Sí | ARN de la fase que se utiliza como origen de la grabación. | 
| `session_id` | cadena | Sí | Cadena que representa el valor de `session_id` de la fase en la que se graba al participante. | 
| `participant_id` | cadena | Sí | Cadena que representa el identificador del participante grabado. | 
| `recording_started_at` | cadena | Condicional | Marca de hora UTC RFC 3339 cuando se inició la grabación. No está disponible cuando `recording_status` está`RECORDING_START_FAILED`. Consulte también la nota siguiente para obtener más información sobre `recording_ended_at`. | 
| `recording_ended_at` | cadena | Condicional | Marca de tiempo UTC RFC 3339 cuando finalizó la grabación. Esto solo está disponible cuando `recording_status` es `"RECORDING_ENDED"` o `"RECORDING_ENDED_WITH_FAILURE"`. **Nota:** `recording_started_at` y `recording_ended_at` son marcas de tiempo que indican cuando se generan estos eventos y es posible que no coincidan exactamente con las marcas de tiempo del segmento de video HLS. Para determinar con precisión la duración de una grabación, utilice la `duration_ms`. | 
| `recording_status` | cadena | Sí | El estado de la grabación. Valores válidos: `"RECORDING_STARTED"`, `"RECORDING_ENDED"`, `"RECORDING_START_FAILED"`, `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `recording_status_message` | cadena | Condicional | Información descriptiva sobre el estado. Esto solo está disponible cuando `recording_status` es `"RECORDING_ENDED"` o `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `media` | objeto | Sí | Objeto que contiene los objetos enumerados de contenido multimedia disponibles para esta grabación. Valor válido: `"hls"`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sí | Campo enumerado que describe la salida del formato HLS de Apple. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | integer | Condicional | Duración del contenido HLS grabado en milisegundos. Esto solo está disponible cuando `recording_status` es `"RECORDING_ENDED"` o `"RECORDING_ENDED_WITH_FAILURE"`. Si se produjo un error antes de realizar cualquier grabación, esto es 0. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sí | Ruta relativa del prefijo S3 donde se almacena el contenido HLS. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sí | Nombre del archivo de lista de reproducción maestra HLS. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sí | Matriz de representaciones (variantes HLS) de objetos de metadatos. Siempre hay al menos una copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sí | Ruta relativa del prefijo S3 donde se almacena el contenido HLS para esta copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sí | Nombre del archivo de lista de reproducción multimedia para esta copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Condicional | Campo enumerado que describe la salida de miniaturas. Esto está disponible solo cuando el campo `storage` de la configuración de miniaturas incluye `SEQUENTIAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | cadena | Sí | Ruta relativa desde el prefijo de S3 donde se almacena el contenido secuencial de miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sí | Matriz de representaciones (variantes de miniaturas) de objetos de metadatos. Siempre hay al menos una copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sí | Ruta relativa desde el prefijo de S3 donde se almacena el contenido de miniaturas para esta representación. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Condicional | Campo enumerado que describe la salida de miniaturas. Esto está disponible solo cuando el campo `storage` de la configuración de miniaturas incluye `LATEST`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | cadena | Sí | Ruta relativa del prefijo de S3 donde `latest_thumbnail` se almacena. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sí | Matriz de representaciones (variantes de miniaturas) de objetos de metadatos. Siempre hay al menos una copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sí | Ruta relativa desde el prefijo de S3 donde se almacena la miniatura más reciente para esta representación. | 
| `version` | cadena | Sí | La versión del esquema de metadatos. | 

### Ejemplo: recording-started.json
<a name="ind-part-rec-json-ex-rec-start"></a>

```
{
   "version": "v1",
   "stage_arn": "arn:aws:ivs:us-west-2:aws_account_id:stage/AbCdef1G2hij",
   "session_id": "st-ZyXwvu1T2s",
   "participant_id": "xYz1c2d3e4f",
   "recording_started_at": "2024-03-13T13:17:17Z",
   "recording_status": "RECORDING_STARTED",
   "media": {
      "hls": {
         "path": "media/hls",
         "playlist": "multivariant.m3u8",
         "renditions": [
            {
               "path": "high",
               "playlist": "playlist.m3u8"
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "renditions": [
            {
               "path": "high"
            }
         ]
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail",
         "renditions": [
            {
               "path": "high"
            }
         ]
      }
   }
}
```

### Ejemplo: recording-ended.json
<a name="ind-part-rec-json-ex-rec-end"></a>

```
{
   "version": "v1",
   "stage_arn": "arn:aws:ivs:us-west-2:aws_account_id:stage/AbCdef1G2hij",
   "session_id": "st-ZyXwvu1T2s",
   "participant_id": "xYz1c2d3e4f",
   "recording_started_at": "2024-03-13T19:44:19Z",
   "recording_ended_at": "2024-03-13T19:55:04Z",
   "recording_status": "RECORDING_ENDED",
   "media": {
      "hls": {
         "duration_ms": 645237,
         "path": "media/hls",
         "playlist": "multivariant.m3u8",
         "renditions": [
            {
               "path": "high",
               "playlist": "playlist.m3u8"
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "renditions": [
            {
               "path": "high"
            }
         ]
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail",
         "renditions": [
            {
               "path": "high"
            }
         ]
      }
   }
}
```

### Ejemplo: recording-failed.json
<a name="ind-part-rec-json-ex-rec-failed"></a>

```
{
   "version": "v1",
   "stage_arn": "arn:aws:ivs:us-west-2:aws_account_id:stage/AbCdef1G2hij",
   "session_id": "st-ZyXwvu1T2s",
   "participant_id": "xYz1c2d3e4f",
   "recording_started_at": "2024-03-13T19:44:19Z",
   "recording_ended_at": "2024-03-13T19:55:04Z",
   "recording_status": "RECORDING_ENDED_WITH_FAILURE",
   "media": {
      "hls": {
         "duration_ms": 645237,
         "path": "media/hls",
         "playlist": "multivariant.m3u8",
         "renditions": [
            {
               "path": "high",
               "playlist": "playlist.m3u8"
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "renditions": [
            {
               "path": "high"
            }
         ]
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail",
         "renditions": [
            {
               "path": "high"
            }
         ]
      }
   }
}
```

## Conversión de grabaciones a MP4
<a name="ind-part-rec-convert-rec-mp4"></a>

Las grabaciones de participantes individuales se almacenan en el formato HLS, que consta de listas de reproducción y segmentos MP4 fragmentados (fMP4). Para convertir una grabación HLS en un único archivo MP4, instale FFmpeg y ejecute el siguiente comando:

```
ffmpeg -i /path/to/playlist.m3u8 -i /path/to/playlist.m3u8 -map 0:v -map 1:a -c copy output.mp4
```

# Grabación compuesta de IVS \$1 Transmisión en tiempo real
<a name="rt-composite-recording"></a>

Este documento explica cómo utilizar la característica de grabación compuesta en la [composición del servidor](server-side-composition.md). La grabación compuesta permite generar grabaciones HLS de un escenario IVS al combinar de forma eficaz todos los publicadores de escenarios en una sola vista mediante un servidor IVS y, a continuación, guardar el vídeo resultante en un bucket de S3.

Se aplican los costos estándar de almacenamiento y solicitudes de S3. Las miniaturas no generan cargos adicionales de IVS. Para obtener más información, consulte [Precios de Amazon IVS](https://aws.amazon.com/ivs/pricing/).

## Requisitos previos
<a name="comp-rec-prerequisites"></a>

Para utilizar la grabación compuesta, debe disponer de una fase con publicadores activos y un bucket de S3 para utilizarlo como destino de grabación. A continuación, describimos un posible flujo de trabajo que utiliza eventos de EventBridge para grabar una composición en un bucket de S3. Como alternativa, puede iniciar y detener las composiciones según la lógica de su propia aplicación.

1. Cree [un escenario de IVS](getting-started-create-stage.md) y tokens de participante para cada publicador.

1. Cree una [EncoderConfiguration](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateEncoderConfiguration.html) (un objeto que represente cómo debe renderizarse el vídeo grabado).

1. Cree un [bucket de S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) y una [StorageConfiguration](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html) (donde se almacenará el contenido de la grabación).

   **Importante**: Si utiliza un bucket de S3 existente, la configuración **Propiedad del objeto** debe ser **Aplicada al propietario del bucket** o **Propietario del bucket preferido**. Para obtener más información, consulte la documentación de S3 sobre el [control de la propiedad de los objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html).

1. [Únase al escenario y publique en él](getting-started-pub-sub.md).

1. Cuando reciba un [evento de EventBridge](eventbridge.md) publicado por un participante, llame a [startComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html) con un objeto DestinationConfiguration de S3 como destino.

1. Tras unos segundos, debería poder ver cómo los segmentos HLS se conservan en sus buckets de S3.

![\[Grabación de un escenario en un bucket de S3 mediante la composición del servidor.\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/images/Composite_Recording_Workflow.png)


**Nota:** Una composición se apaga automáticamente después de 60 segundos de inactividad por parte de los publicadores participantes en el escenario. En ese momento, la composición finaliza y pasa a un estado `STOPPED`. Una composición se borra automáticamente después de unos minutos en ese estado `STOPPED`. Para obtener más información, consulte [Ciclo de vida de la composición](ssc-overview.md#ssc-composition-endpoint) en *Composición del servidor.*

## Ejemplo de grabación compuesta: inicie la composición con un destino de bucket de S3
<a name="comp-rec-example"></a>

El siguiente ejemplo muestra una llamada típica a la operación [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html), en la que se especifica S3 como único destino de la composición. Una vez que la composición pase a un estado `ACTIVE`, los segmentos de vídeo y los metadatos comenzarán a escribirse en el bucket de S3 especificado por el objeto `storageConfiguration`. Para crear composiciones con diferentes diseños, consulte la sección “Diseños” en [Composición del servidor](ssc-overview.md#ssc-api-layouts) y la [Referencia de la API de transmisión en tiempo real de IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_LayoutConfiguration.html).

### Solicitud
<a name="comp-rec-example-request"></a>

```
POST /StartComposition HTTP/1.1
Content-type: application/json

{
   "destinations": [
      {
         "s3": {
            "encoderConfigurationArns": [
              "arn:aws:ivs:ap-northeast-1:927810967299:encoder-configuration/PAAwglkRtjge"
            ],
            "storageConfigurationArn": "arn:aws:ivs:ap-northeast-1:927810967299:storage-configuration/ZBcEbgbE24Cq",
	    "thumbnailConfigurations": [
	       {
		  "storage": ["LATEST", "SEQUENTIAL"],
		  "targetIntervalSeconds": 30
               }
	    ]
	 }
      }
   ],
   "idempotencyToken": "db1i782f1g9",
   "stageArn": "arn:aws:ivs:ap-northeast-1:927810967299:stage/WyGkzNFGwiwr"
}
```

### Respuesta
<a name="comp-rec-example-response"></a>

```
{
    "composition": {
        "arn": "arn:aws:ivs:ap-northeast-1:927810967299:composition/s2AdaGUbvQgp",
        "destinations": [
            {
                "configuration": {
                    "name": "",
                    "s3": {
                        "encoderConfigurationArns": [
                            "arn:aws:ivs:ap-northeast-1:927810967299:encoder-configuration/PAAwglkRtjge"
                        ],
                        "recordingConfiguration": {
                            "format": "HLS"
                        },
                        "storageConfigurationArn": "arn:aws:ivs:ap-northeast-1:927810967299:storage-configuration/ZBcEbgbE24Cq",
	                "thumbnailConfigurations": [
	                   {
		              "storage": ["LATEST", "SEQUENTIAL"],
		              "targetIntervalSeconds": 30
                           }
	                ]
                    }
                },
                "detail": {
                    "s3": {
                        "recordingPrefix": "MNALAcH9j2EJ/s2AdaGUbvQgp/2pBRKrNgX1ff/composite"
                    }
                },
                "id": "2pBRKrNgX1ff",
                "state": "STARTING"
            }
        ],
        "layout": null,
        "stageArn": "arn:aws:ivs:ap-northeast-1:927810967299:stage/WyGkzNFGwiwr",
        "startTime": "2023-11-01T06:25:37Z",
        "state": "STARTING",
        "tags": {}
    }
}
```

El campo `recordingPrefix`, presente en la respuesta de StartComposition, se puede utilizar para determinar dónde se almacenará el contenido de la grabación. 

## Grabación de contenidos
<a name="comp-rec-contents"></a>

Cuando la composición pasa al estado `ACTIVE`, los segmentos de video HLS, los archivos de metadatos y las miniaturas (si están configuradas) se comenzarán a escribir en el bucket de S3 especificado durante la llamada a StartComposition. Este contenido está disponible para posprocesamiento o reproducción como video bajo demanda.

Tenga en cuenta que, después de que una composición se pone en vivo, se emite un evento “Cambio de estado de composición IVS”, y puede tomar un poco de tiempo antes de que los archivos de manifiesto, los segmentos de video y las miniaturas sean escritos. Le recomendamos que reproduzca o procese transmisiones grabadas solo después de que se reciba el evento “Cambio en el estado de la composición de IVS (fin de la sesión)” Para obtener más detalles, vea [Uso de EventBridge con la transmisión en tiempo real de IVS](eventbridge.md).

A continuación, se muestra una estructura de directorios de ejemplo y el contenido de una grabación de una sesión en vivo de IVS:

```
MNALAcH9j2EJ/s2AdaGUbvQgp/2pBRKrNgX1ff/composite
   events
      recording-started.json
      recording-ended.json
   media
      hls
      thumbnails
      latest_thumbnail
```

La carpeta `events` contiene los archivos de metadatos correspondientes al evento de grabación. Los archivos de metadatos JSON se generan cuando la grabación se inicia, finaliza correctamente o termina con errores:
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

Una carpeta `events` contendrá `recording-started.json` y `recording-ended.json` o `recording-failed.json`.

Estos contienen metadatos relacionados con la sesión grabada y sus formatos de salida. Los detalles de JSON se dan a continuación.

La carpeta `media` contiene el contenido multimedia compatible. La subcarpeta `hls` contiene todos los archivos multimedia y de manifiesto generados durante la sesión compuesta y se puede reproducir con el reproductor de IVS. El manifiesto HLS se encuentra en la carpeta `multivariant.m3u8`. Si está configurado, las subcarpetas `thumbnails` y `latest_thumbnail` contienen archivos multimedia de miniaturas en formato JPEG generados durante la sesión de composición.

## Política de bucket para StorageConfiguration
<a name="comp-rec-bucket-policy"></a>

Cuando se crea un objeto StorageConfiguration, IVS tendrá acceso para escribir contenido en el bucket de S3 especificado. Este acceso se concede mediante modificaciones en la política del bucket de S3. *Si la política del bucket se modifica de forma que se elimine el acceso del IVS, las grabaciones nuevas y en curso fallarán.*

El siguiente ejemplo muestra una política de bucket de S3 que permite a IVS escribir en el bucket de S3:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CompositeWrite-y1d212y",
            "Effect": "Allow",
            "Principal": {
                "Service": "ivs-composite.ap-northeast-1.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                },
                "Bool": {
                    "aws:SecureTransport": "true"
                }
            }
        }
    ]
}
```

------

## Archivos de metadatos JSON
<a name="comp-rec-json"></a>

Estos metadatos están en formato JSON. Contiene la siguiente información: 


| Campo | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
| `stage_arn` | string | Sí | ARN del escenario que se utiliza como fuente de la composición. | 
| `media` | objeto | Sí | Objeto que contiene los objetos enumerados de contenido multimedia disponibles para esta grabación. Valores válidos: `"hls"`.  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html) | objeto | Sí | Campo enumerado que describe la salida del formato HLS de Apple. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | integer | Condicional | Duración del contenido HLS grabado en milisegundos. Esto solo está disponible cuando `recording_status` es `"RECORDING_ENDED"` o `"RECORDING_ENDED_WITH_FAILURE"`. Si se produjo un error antes de realizar cualquier grabación, esto es 0. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sí | Ruta relativa del prefijo S3 donde se almacena el contenido HLS. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sí |  Nombre del archivo de lista de reproducción maestra HLS.  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sí | Matriz de copias (variante HLS) de objetos de metadatos. Siempre hay al menos una copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sí | Ruta relativa del prefijo S3 donde se almacena el contenido HLS para esta copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sí | Nombre del archivo de lista de reproducción multimedia para esta copia. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Condicional | Altura de resolución de píxeles del video codificado. Solo está disponible cuando la copia contiene una pista de video. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Condicional | Ancho de resolución de píxeles del video codificado. Solo está disponible cuando la copia contiene una pista de video. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Condicional | Campo enumerado que describe la salida de miniaturas. Esto está disponible solo cuando el campo `storage` de la configuración de miniaturas incluye `SEQUENTIAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | cadena | Sí | Ruta relativa desde el prefijo de S3 donde se almacena el contenido secuencial de miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sí | Matriz de resoluciones (variantes de miniaturas) de objetos de metadatos. Siempre hay al menos una resolución. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | cadena | Sí | Ruta relativa desde el prefijo de S3 donde se almacena el contenido de miniaturas para esta resolución. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sí | Altura de resolución en píxeles de las miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sí | Ancho de resolución en píxeles de las miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Condicional | Campo enumerado que describe la salida de miniaturas. Esto está disponible solo cuando el campo `storage` de la configuración de miniaturas incluye `LATEST`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | cadena | Sí | Ruta relativa del prefijo de S3 donde `latest_thumbnail` se almacena. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sí | Matriz de resoluciones (variantes de miniaturas) de objetos de metadatos. Siempre hay al menos una resolución. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | cadena | Sí | Ruta relativa desde el prefijo de S3 donde se almacena la miniatura más reciente para esta resolución. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sí | Altura de resolución en píxeles de la miniatura más reciente. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sí | Ancho de resolución en píxeles de la miniatura más reciente. | 
| `recording_ended_at` | cadena | Condicional | Marca de tiempo UTC RFC 3339 cuando finalizó la grabación. Esto solo está disponible cuando `recording_status` es `"RECORDING_ENDED"` o `"RECORDING_ENDED_WITH_FAILURE"`. `recording_started_at` y `recording_ended_at` son marcas de tiempo cuando se generan estos eventos y es posible que no coincidan exactamente con las marcas de tiempo del segmento de video HLS. Para determinar con precisión la duración de una grabación, utilice la `duration_ms`.  | 
| `recording_started_at` | cadena | Condicional | Marca de hora UTC RFC 3339 cuando se inició la grabación. No está disponible cuando `recording_status` está`RECORDING_START_FAILED`. Consulte la nota que figura arriba para `recording_ended_at`.  | 
| `recording_status` | cadena | Sí | El estado de la grabación. Valores válidos: `"RECORDING_STARTED"`, `"RECORDING_ENDED"`, `"RECORDING_START_FAILED"`, `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `recording_status_message` | cadena | Condicional | Información descriptiva sobre el estado. Esto solo está disponible cuando `recording_status` es `"RECORDING_ENDED"` o `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `version` | cadena | Sí | La versión del esquema de metadatos. | 

### Ejemplo: recording-started.json
<a name="comp-rec-json-ex-rec-start"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-11-01T06:01:36Z",
  "recording_status": "RECORDING_STARTED",
  "media": {
    "hls": {
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

### Ejemplo: recording-ended.json
<a name="comp-rec-json-ex-rec-end"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-10-27T17:00:44Z",
  "recording_ended_at": "2023-10-27T17:08:24Z",
  "recording_status": "RECORDING_ENDED",
  "media": {
    "hls": {
      "duration_ms": 460315,
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

### Ejemplo: recording-failed.json
<a name="comp-rec-json-ex-rec-fail"></a>

```
{
  "version": "v1",
  "stage_arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/aAbBcCdDeE12",
  "recording_started_at": "2023-10-27T17:00:44Z",
  "recording_ended_at": "2023-10-27T17:08:24Z",
  "recording_status": "RECORDING_ENDED_WITH_FAILURE",
  "media": {
    "hls": {
      "duration_ms": 460315,
      "path": "media/hls",
      "playlist": "multivariant.m3u8",
      "renditions": [
        {
          "path": "720p30-abcdeABCDE12",
          "playlist": "playlist.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    },
    "latest_thumbnail": {
      "path": "media/latest_thumbnail",
      "resolutions": [
        {
          "path": "1280x720",
          "resolution_width": 1280,
          "resolution_height": 720
        }
      ]
    }
  }
}
```

## Reproducción de contenido grabado desde buckets privados
<a name="comp-rec-playback"></a>

El contenido grabado es privado de forma predeterminada; por lo tanto, no se puede acceder a ellos para reproducirlos mediante la dirección URL directa de S3. Si intenta abrir la lista de reproducción multivariada HLS (archivo m3u8) para su reproducción mediante el reproductor de IVS u otro reproductor, recibirá un error (por ejemplo, “You do not have permission to access the requested resource” [No tiene permiso para acceder al recurso solicitado]). En su lugar, puede reproducir estos archivos mediante la Red de entrega de contenido (CDN, Content Delivery Network) de Amazon CloudFront.

Las distribuciones de CloudFront pueden configurarse para distribuir contenido desde buckets privados. Por lo general, esto es preferible a tener buckets de acceso abierto donde las lecturas omiten los controles que ofrece CloudFront. Puede configurar la distribución para que funcione desde un bucket privado mediante la creación de un control de acceso de origen (OAC), que es un usuario especial de CloudFront que tiene permisos de lectura en el bucket de origen privado. Puede crear el OAC cuando cree su distribución a través de la consola o la API de CloudFront. Consulte [Creación de un nuevo control de acceso de origen](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3) en la *Guía para desarrolladores de Amazon CloudFront*.

### Configuración de la reproducción mediante CloudFront con CORS activado
<a name="comp-rec-playback-setup"></a>

En este ejemplo, se explica cómo un desarrollador puede configurar una distribución de CloudFront con CORS habilitado, lo que permite la reproducción de sus grabaciones desde cualquier dominio. Esto resulta especialmente útil durante la fase de desarrollo, pero puede modificar el siguiente ejemplo para adaptarlo a sus necesidades de producción.

#### Paso 1: crear un bucket de S3
<a name="comp-rec-playback-setup-step1"></a>

Crear un bucket de S3 que se utilizará para almacenar las grabaciones. Tenga en cuenta que el bucket debe estar en la misma región que utiliza para su flujo de trabajo de IVS.

Agregar una política de permisos CORS al bucket:

1. En la consola de AWS, vaya a la pestaña **Permisos de bucket de S3**.

1. Copie la política de CORS que se encuentra a continuación y péguela en **Cross-origin resource sharing (CORS**). Esto habilitará el acceso a CORS en el bucket de S3.

   ```
   [
       {
           "AllowedHeaders": [
               "*"
           ],
           "AllowedMethods": [
               "PUT",
               "POST",
               "DELETE",
               "GET"
           ],
           "AllowedOrigins": [
               "*"
           ],
           "ExposeHeaders": [
               "x-amz-server-side-encryption",
               "x-amz-request-id",
               "x-amz-id-2"
           ]
       }
   ]
   ```

#### Paso 2: crear una distribución de CloudFront.
<a name="comp-rec-playback-setup-step2"></a>

Consulte [Creación de una distribución de CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html) en la *Guía para desarrolladores de CloudFront*.

Mediante la consola de AWS, ingrese la siguiente información:


| Para este campo… | Elija esto... | 
| --- | --- | 
| Dominio de origen | El bucket de S3 en el paso anterior. | 
| Acceso de origen | Configuración del control de acceso de origen (recomendado), mediante parámetros por defecto | 
| Comportamiento predeterminado de la caché: política de protocolo de visualización | Redireccionamiento de HTTP a HTTPS | 
| Comportamiento predeterminado de la caché: métodos HTTP permitidos | GET, HEAD y OPTIONS | 
| Comportamiento predeterminado de la caché: solicitudes de origen y clave de caché | Política de caché deshabilitada | 
| Comportamiento de caché predeterminado: política de solicitudes de Origin | CORS-S3Origin | 
| Comportamiento predeterminado de la caché: política de encabezados de respuesta | SimpleCORS | 
| firewall de aplicaciones web | Habilitar protecciones de seguridad | 

A continuación, guarde la distribución de CloudFront.

#### Paso 3: configurar la política de bucket de S3
<a name="comp-rec-playback-setup-step3"></a>

1. Elimine cualquier configuración de almacenamiento que haya configurado para el bucket de S3. Esto eliminará todas las políticas de bucket que se hayan agregado automáticamente al crear la política para ese bucket.

1. Vaya a su distribución de CloudFront, asegúrese de que todos los campos de distribución estén en los estados definidos en el paso anterior y **copie la política de bucket** (utilice el botón **Copiar política**). 

1. Vaya a su bucket de S3. En la pestaña **Permisos**, seleccione **Editar política de bucket** y pegue la política de bucket que copió en el paso anterior. Tras este paso, la política de bucket debe tener exclusivamente la política de CloudFront. 

1. Cree una StorageConfiguration, especificando el bucket de S3.

Una vez creada la StorageConfiguration, verá dos elementos en la política de bucket de S3: uno que permite a CloudFront leer el contenido y otro que permite a IVS escribir contenido. Un ejemplo de política de bucket final, con acceso a CloudFront e IVS, se muestra en [Ejemplo: Política de bucket de S3 con CloudFront e IVS Access](#comp-rec-playback-example).

#### Paso 4: reproducir grabaciones
<a name="comp-rec-playback-setup-step4"></a>

Tras configurar correctamente la distribución de CloudFront y actualizar la política de bucket, debería poder reproducir las grabaciones con el reproductor IVS:

1. Inicie correctamente una composición y asegúrese de tener una grabación almacenada en el bucket de S3.

1. Tras seguir los pasos 1 a 3 de este ejemplo, los archivos de vídeo deben estar disponibles para su utilización a través de la URL de CloudFront. Su URL de CloudFront es el **Nombre del dominio de distribución** en la pestaña **Detalles** de la consola de Amazon CloudFront. Debe tener un aspecto similar al siguiente: 

   `a1b23cdef4ghij.cloudfront.net`

1. Para reproducir el video grabado a través de la distribución de CloudFront, busque la clave de objeto para su archivo `multivariant.m3u8` en el bucket de s3. Debe tener un aspecto similar al siguiente:

   `FDew6Szq5iTt/9NIpWJHj0wPT/fjFKbylPb3k4/composite/media/hls/multivariant.m3u8`

1. Agregue la clave de objeto al final de la URL de CloudFront. Su URL final tendrá un aspecto similar al siguiente:

   `https://a1b23cdef4ghij.cloudfront.net/FDew6Szq5iTt/9NIpWJHj0wPT/fjFKbylPb3k4/composite/media/hls/multivariant.m3u8`

1. Ahora puede añadir la URL final al atributo fuente de un reproductor IVS para ver la grabación completa. Para ver el vídeo grabado, puede utilizar la demostración en [Cómo empezar](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/web-getting-started.html) en el *SDK del reproductor de IVS: Guía web*.

### Ejemplo: política de bucket de S3 con CloudFront e IVS Access
<a name="comp-rec-playback-example"></a>

El siguiente fragmento ilustra una política de bucket de S3 que permite a CloudFront leer contenido en el bucket privado e IVS para escribir contenido en el bucket. **Nota: No copie ni pegue el siguiente fragmento en su propio bucket. Su política debe contener los ID relevantes para su distribución de CloudFront y StorageConfiguration.**

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CompositeWrite-7eiKaIGkC9DO",
      "Effect": "Allow",
      "Principal": {
        "Service": "ivs-composite.ap-northeast-1.amazonaws.com"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::eicheane-test-1026-2-ivs-recordings/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        },
        "Bool": {
          "aws:SecureTransport": "true"
        }
      }
    },
    {
      "Sid": "AllowCloudFrontServicePrincipal",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::eicheane-test-1026-2-ivs-recordings/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::844311324168:distribution/E1NG4YMW5MN25A"
        }
      }
    }
  ]
}
```

------

## Solución de problemas
<a name="comp-rec-troubleshooting"></a>
+ **La composición no está escrita en el bucket de S3:** asegúrese de que el bucket de S3 y los objetos StorageConfiguration estén creados y estén en la misma región. Asegúrese también de que IVS tenga acceso al bucket consultando su política de bucket; consulte [Política de buckets para la configuración de almacenamiento.](#comp-rec-bucket-policy)
+ **No encuentro una composición cuando ejecuto *ListCompositions***. Las composiciones son recursos efímeros. Una vez que pasan a un estado final, se eliminan automáticamente después de unos minutos.
+ **Mi composición se detiene automáticamente:** una composición se detiene automáticamente si no hay ningún publicador en el escenario durante más de 60 segundos.

## Problema conocido
<a name="comp-rec-issues"></a>

La lista de reproducción multimedia escrita mediante grabación compuesta tiene la etiqueta `#EXT-X-PLAYLIST-TYPE:EVENT` mientras la composición está en curso. Una vez finalizada la composición, la etiqueta se actualiza a `#EXT-X-PLAYLIST-TYPE:VOD`. Para una experiencia de reproducción fluida, le recomendamos que utilice esta lista de reproducción solo después de que la composición se haya finalizado correctamente.