

# Gravação do IVS \$1 Streaming em tempo real
<a name="rt-recording"></a>

Há duas opções de gravação para streaming em tempo real do IVS:
+ Com a gravação individual de participante, cada mídia do publicador é gravada em arquivos separados.
+ Por outro lado, a gravação composta junta as mídias de todos os publicadores em uma única visualização e as grava em um único arquivo.

A gravação individual de participante não incorre em cobranças adicionais do Amazon IVS, enquanto a gravação composta incorre em cobranças pela taxa por hora do vídeo codificado. Ambas as opções de gravação incorrem em custos padrão de armazenamento e solicitação do S3. Para obter mais detalhes, consulte [Preços do Amazon IVS](https://aws.amazon.com/ivs/pricing/).

Para uma solução mais personalizável, considere usar o projeto de código aberto [IVSStageSaver](https://github.com/aws-samples/amazon-ivs-stage-recorder) como base para seu próprio serviço de gravação auto-hospedado.

## Gravação individual de participante
<a name="ind-par-rec"></a>

Essa opção é ideal para transmissões ao vivo com um único publicador ou quando são necessárias gravações separadas de cada publicador, especialmente para fins de moderação. Para obter mais detalhes, consulte [Gravação individual de participante](rt-individual-participant-recording.md).

![\[Gravação da mídia de cada publicador em um arquivo separado usando a gravação de cada participante.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## Gravação composta
<a name="comp-rec"></a>

Esta opção combina a mídia de vários publicadores em uma única visualização e a grava em um arquivo, ideal para uma experiência de vídeo sob demanda. Para obter mais detalhes, consulte [Gravação composta](rt-composite-recording.md).

![\[Como gravar um palco em um bucket do S3 usando a composição do servidor.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/images/Composite_Recording.png)


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

A gravação de miniaturas para streaming em tempo real do IVS pode ser configurada tanto para gravações individuais de participantes quanto para gravações compostas (com vários participantes). Para ativar ou desativar a gravação de miniaturas e ajustar o intervalo em que as miniaturas são geradas:
+ Para gravações individuais de participantes, use a propriedade `thumbnailConfiguration`.
+ Para gravações compostas, use a propriedade `thumbnailConfigurations`.

Os intervalos das miniaturas podem variar de 1 segundo a 86400 segundos (24 horas); por padrão, a gravação de miniaturas está desabilitada. Para obter mais detalhes, consulte [Amazon IVS Real-Time Streaming API Reference](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/Welcome.html).

A configuração de miniaturas inclui um campo `storage`, que pode ser definido como `SEQUENTIAL` e/ou `LATEST`. O campo `storage` determina o comportamento de armazenamento do S3 para as miniaturas:
+ `SEQUENTIAL` salva todas as miniaturas em série. Esse é o padrão.
+ `LATEST` salva somente a miniatura mais recente, substituindo a anterior.

Se você especificar `SEQUENTIAL` e `LATEST`, as miniaturas serão gravadas em dois caminhos diferentes do S3, um para o arquivamento sequencial e outro para a miniatura mais recente.

# Gravação individual de participante do IVS \$1 Streaming em tempo real
<a name="rt-individual-participant-recording"></a>

Este documento explica como usar a gravação de participantes individuais com o streaming em tempo real do IVS.

Sujeito a custos de armazenamento padrão e solicitação do S3. As miniaturas não incorrem em cobranças adicionais do IVS. Para obter mais detalhes, consulte [Preços do Amazon IVS](https://aws.amazon.com/ivs/pricing/).

## Introdução
<a name="ind-part-rec-introduction"></a>

A gravação individual de participante permite que os clientes de streaming em tempo real do IVS gravem os publicadores de palco do IVS individualmente em buckets do S3. Quando a gravação individual de participante está habilitada para um palco, o conteúdo do publicador é gravado assim que ele começa a publicar no palco.

**Observação:** se você precisar juntar todos os participantes do palco em um único vídeo, o recurso de gravação composta é o mais adequado. Consulte [Gravação](rt-recording.md) para obter um resumo da gravação de conteúdo de streaming em tempo real do IVS.

![\[Gravação da mídia de cada publicador em um arquivo separado usando a gravação de cada participante.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/images/Individual_Participant_Recording.png)


## Fluxo de trabalho
<a name="ind-part-rec-workflow"></a>

![\[Fluxo de trabalho da gravação da mídia de cada publicador em um arquivo separado usando a gravação de cada participante.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/images/Workflow_Participant_Recording.png)


### 1. Crie um bucket do S3
<a name="ind-part-rec-create-s3-bucket"></a>

Você precisará de um bucket do S3 para gravar VODs. Para obter detalhes, consulte a documentação do S3 sobre [como criar buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html). Observe que, para a gravação individual de participante, os buckets do S3 devem ser criados na mesma região da AWS do palco do IVS.

**Importante**: se você usa um bucket do S3 existente:
+ A configuração de **Propriedade do objeto** deve ser **Imposta pelo proprietário do bucket** ou **Preferencial do proprietário do bucket**.
+ A configuração de **Criptografia padrão** deve ser **Criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3)**.

Para obter mais detalhes, consulte a documentação do S3 sobre como [controlar a propriedade de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) e [proteger dados com criptografia](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html).

### 2. Criar um objeto StorageConfiguration
<a name="ind-part-rec-create-storageconfig-object"></a>

Depois de criar um bucket, chame a API de streaming em tempo real do IVS para [criar um objeto StorageConfiguration](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html). Depois que a configuração de armazenamento for criada com êxito, o IVS terá permissão para gravar no bucket fornecido do S3. Você pode reutilizar esse objeto StorageConfiguration em vários palcos.

### 3. Criar um palco com tokens de participantes
<a name="ind-part-rec-create-stage-with-part-tokens"></a>

Agora você precisa [criar um palco do IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStage.html) com a gravação individual de participante habilitada (definindo o objeto AutoParticipantRecordingConfiguration), bem como tokens de participantes para cada publicador.

A solicitação abaixo cria um palco com dois tokens de participantes e a gravação individual de participante 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. Entrar no palco como publicador ativo
<a name="ind-part-rec-join-stage-as-active-pub"></a>

Distribua os tokens de participantes para os publicadores e faça com que eles entrem no palco e comecem a [publicar nele](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/getting-started-pub-sub.html).

Quando eles entram no palco e começam a publicar nele usando um dos [SDKs de transmissão de streaming em tempo real do IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/broadcast.html), o processo de gravação do participante é iniciado automaticamente e envia para você um [evento do EventBridge](eventbridge.md) indicando que a gravação começou. (O evento é Alteração do estado da gravação do participante do IVS - Início da gravação.) Ao mesmo tempo, o processo de gravação do participante começa a gravar os arquivos VOD e de metadados no bucket configurado do S3. Observação: não é garantido que os participantes conectados por períodos extremamente curtos (menos de 5s) sejam gravados.

Há duas maneiras de obter o prefixo do S3 para cada gravação:
+ Receber o evento do 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"
     }
  }
  ```
+ Usar a operação da API [GetParticipant](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_GetParticipant.html): a resposta inclui o prefixo e o bucket do S3 de onde um participante está sendo gravado. A solicitação é:

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

  E esta é a resposta:

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

### 5. Reproduzir o VOD
<a name="ind-part-rec-play-back-vod"></a>

Depois que a gravação for finalizada, você poderá assisti-la usando o [reprodutor do IVS](https://debug.ivsdemos.com/?p=ivs). Consulte [Reprodução de conteúdo gravado de buckets privados](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/rt-composite-recording.html#comp-rec-playback) para obter instruções sobre como configurar distribuições do CloudFront para reprodução de VOD.

## Gravação somente de áudio
<a name="ind-part-rec-audio-only-recordings"></a>

Ao configurar a gravação individual de participante, você pode optar por ter somente segmentos de áudio HLS gravados no bucket do S3. Para usar esse recurso, escolha `AUDIO_ONLY mediaType` ao criar o palco:

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

## Gravação somente de miniaturas
<a name="ind-part-rec-recording-thumbnail-only"></a>

Ao configurar a gravação individual de participante, você pode optar por ter apenas miniaturas gravadas no seu bucket do S3. Para usar esse atributo, defina `mediaType` como `NONE` ao criar o estágio. Isso garante que nenhum segmento HLS seja gerado; as miniaturas ainda são criadas e gravadas no seu bucket do 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"
      }
   ]
}
```

## Conteúdo do registro
<a name="ind-part-rec-recording-contents"></a>

Quando a gravação individual de participante estiver ativa, segmentos de vídeo HLS, arquivos de metadados e miniaturas começarão a ser gravados no bucket do S3 fornecido quando o estágio foi criado. Esse conteúdo está disponível para pós-processamento ou reprodução como vídeo sob demanda.

Observe que depois que uma gravação é finalizada, um evento Alteração do estado da gravação do participante do IVS - Início da gravação é enviado pelo EventBridge. Recomendamos que você reproduza ou processe streams gravados somente após o evento ter sido recebido. Para mais detalhes, consulte [Usar o EventBridge com o streaming em tempo real do IVS](eventbridge.md)

Veja a seguir um exemplo de estrutura de diretório e conteúdo de uma gravação de uma sessão do IVS ao vivo:

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

A pasta `events` contém os arquivos de metadados correspondentes ao evento de gravação. Os arquivos de metadados JSON são gerados quando a gravação é iniciada, termina com êxito ou termina com falhas:
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

Uma determinada pasta de `events` vai conter `recording-started.json` e `recording-ended.json` ou `recording-failed.json`. Elas contêm metadados relacionados à sessão gravada e seus formatos de saída. Os detalhes de JSON são fornecidos abaixo.

A pasta `media` contém o conteúdo de mídia compatível. A subpasta `hls` contém todos os arquivos de mídia e manifesto gerados durante a sessão de gravação e pode ser reproduzida com o reprodutor do IVS. Se configuradas, as subpastas `thumbnails` e `latest_thumbnail` contêm arquivos de mídia em miniatura JPEG gerados durante a sessão de gravação.

## Mesclar gravações fragmentadas de participantes individuais
<a name="ind-part-rec-merge-frag"></a>

A propriedade `recordingReconnectWindowSeconds` em uma configuração de gravação permite especificar uma janela de tempo (em segundos) durante a qual o IVS tentará gravar no mesmo prefixo do S3 da sessão anterior se o publicador do palco se desconectar e então se reconectar ao palco. Em outras palavras, se um publicador se desconectar e depois se reconectar dentro do intervalo especificado, as várias gravações serão consideradas uma única gravação e mescladas juntas.

Se a gravação de miniaturas estiver habilitada no modo `SEQUENTIAL`, as miniaturas também serão mescladas sob o mesmo `recordingS3Prefix`. Quando as gravações são mescladas, o contador de miniaturas é reiniciado com base no valor da miniatura anterior que foi gravado para a gravação anterior.

**Eventos de mudança de estado de gravação do IVS no Amazon EventBridge:** os eventos Recording End e os arquivos de metadados JSON recording-ended são atrasados em pelo menos `recordingReconnectWindowSeconds`, pois o IVS espera para garantir que um novo fluxo não seja iniciado.

Para obter instruções sobre como configurar a funcionalidade de mesclagem de fluxos, consulte [Etapa 2: criar um palco com gravação opcional de participantes](getting-started-create-stage.md) em *Conceitos básicos do streaming em tempo real do Amazon IVS*.

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

Para mesclar várias gravações usando o mesmo prefixo do S3, é necessário atender a algumas condições para todas as gravações:
+ O valor da propriedade `recordingReconnectWindowSeconds` de AutoParticipantRecordingConfiguration para o palco estar definido como maior que 0.
+ O `StorageConfigurationArn` usado para gravar os artefatos de VOD ser o mesmo para cada gravação.
+ A diferença de tempo em segundos entre o momento em que o participante sai e volta ao palco ser menor ou igual a `recordingReconnectWindowSeconds`.

Observe que o valor padrão de `recordingReconnectWindowSeconds` é 0, o que desativa a mesclagem.

## Sincronizar várias gravações de participantes
<a name="ind-part-rec-sync-multiple"></a>

As gravações individuais dos participantes incluem tags `EXT-X-PROGRAM-DATE-TIME` nas listaS de reprodução HLS, que fornecem carimbos de data e hora UTC precisos, com precisão de milissegundos, para sincronizar gravações de vários participantes durante o pós-processamento.

Quando você grava vários participantes individualmente e deseja criar uma composição sincronizada (como um layout lado a lado ou picture-in-picture), pode usar esses carimbos de data e hora para alinhar as gravações com precisão, mesmo que os participantes tenham entrado no palco em momentos diferentes ou tenham passado por descontinuidades potencialmente causadas por interrupções de rede.

A lista de reprodução HLS de cada participante inclui tags `EXT-X-PROGRAM-DATE-TIME` que indicam:
+ O início da gravação (primeiro segmento).
+ Quaisquer pontos de descontinuidade durante a gravação; por exemplo, quando ocorre a junção de trechos.

Esses carimbos de data e hora usam precisão de milissegundos e são sincronizados entre todos os participantes usando a mesma referência de tempo.

### Exemplo de lista de reprodução 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
```

As tags `EXT-X-PROGRAM-DATE-TIME` fornecem o horário UTC exato do primeiro segmento e de cada ponto de descontinuidade, permitindo a sincronização precisa com as gravações dos demais participantes.

### Fluxo de trabalho de sincronização
<a name="ind-part-rec-sync-multiple-workflow"></a>

Para sincronizar gravações de vários participantes, extraia os carimbos de data e hora `EXT-X-PROGRAM-DATE-TIME` das tags de cada playlist HLS e use-os para calcular os deslocamentos de tempo. Esses deslocamentos podem, então, ser aplicados durante a composição no pós-processamento usando ferramentas de processamento de vídeo como o FFmpeg. Quando houver descontinuidades nas gravações, os carimbos de data e hora nesses pontos fornecem as referências de tempo necessárias para manter a sincronização precisa ao longo de toda a gravação.

Observação: para uma saída sincronizada em tempo real, sem pós-processamento, considere usar composição do servidor em vez da gravação individual de participantes.

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

Os metadados estão em formato JSON. Eles contêm as seguintes informações: 


| Campo | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
| `stage_arn` | string | Sim | ARN do palco que está sendo usado como a origem da gravação. | 
| `session_id` | string | Sim | String representando o `session_id` do palco em que o participante é gravado. | 
| `participant_id` | string | Sim | String representando o identificador do participante gravado. | 
| `recording_started_at` | string | Condicional | Timestamp RFC 3339 UTC de quando a gravação foi iniciada. Isso não estará disponível quando `recording_status` for `RECORDING_START_FAILED`. Além disso, veja a observação abaixo para `recording_ended_at`. | 
| `recording_ended_at` | string | Condicional | Timestamp RFC 3339 UTC em que a gravação terminou. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. **Observação:** `recording_started_at` e `recording_ended_at` são carimbos de data e hora quando esses eventos são gerados e podem não corresponder exatamente aos carimbos de data e hora do segmento de vídeo HLS. Para determinar com precisão a duração de uma gravação, use o campo `duration_ms`. | 
| `recording_status` | string | Sim | O status da gravação. Valores válidos: `"RECORDING_STARTED"`, `"RECORDING_ENDED"`, `"RECORDING_START_FAILED"`, `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `recording_status_message` | string | Condicional | Informações descritivas sobre o status. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `media` | objeto | Sim | Objeto que contém os objetos enumerados de conteúdo de mídia disponível para essa gravação. Valor válido: `"hls"`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sim | Campo enumerado que descreve a saída do formato HLS da Apple. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | inteiro | Condicional | Duração do conteúdo de HLS gravado em milissegundos. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. Se ocorreu uma falha antes de qualquer gravação ter sido feita, é 0. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Caminho relativo do prefixo S3 onde o conteúdo de HLS é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Nome do arquivo da lista de reprodução principal de HLS. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sim | Matriz de execuções (variantes de HLS) de objetos de metadados. Há sempre pelo menos uma representação. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Caminho relativo do prefixo S3 em que o conteúdo de HLS é armazenado para essa versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Nome do arquivo da lista de reprodução de mídia para esta versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso está disponível somente quando o campo `storage` de configuração da miniatura incluir `SEQUENTIAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde o conteúdo da miniatura sequencial é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sim | Matriz de versões (variantes de miniaturas) de objetos de metadados. Há sempre pelo menos uma representação. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Caminho relativo do prefixo S3 onde o conteúdo da miniatura é armazenado para esta versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso está disponível somente quando o campo `storage` de configuração da miniatura incluir `LATEST`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde `latest_thumbnail` é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | objeto | Sim | Matriz de versões (variantes de miniaturas) de objetos de metadados. Há sempre pelo menos uma representação. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-individual-participant-recording.html)  | string | Sim | Caminho relativo do prefixo S3 onde a miniatura mais recente é armazenada para esta versão. | 
| `version` | string | Sim | A versão do esquema de metadados. | 

### Exemplo: 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"
            }
         ]
      }
   }
}
```

### Exemplo: 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"
            }
         ]
      }
   }
}
```

### Exemplo: 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"
            }
         ]
      }
   }
}
```

## Converter gravações em MP4
<a name="ind-part-rec-convert-rec-mp4"></a>

As gravações de participantes individuais são armazenadas no formato HLS, que consiste em listas de reprodução e segmentos MP4 fragmentados (fMP4). Para converter uma gravação HLS em um único arquivo MP4, instale o FFmpeg e execute o seguinte comando:

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

# Gravação composta do IVS \$1 Streaming em tempo real
<a name="rt-composite-recording"></a>

Este documento explica como usar o recurso de gravação composta na [composição do servidor](server-side-composition.md). A gravação composta permite gerar gravações HLS de um palco do IVS combinando efetivamente todos os publicadores de palco em uma visualização usando um servidor do IVS e salvando o vídeo resultante em um bucket do S3.

Sujeito a custos de armazenamento padrão e solicitação do S3. As miniaturas não incorrem em cobranças adicionais do IVS. Para obter mais detalhes, consulte [Preços do Amazon IVS](https://aws.amazon.com/ivs/pricing/).

## Pré-requisitos
<a name="comp-rec-prerequisites"></a>

Para usar a gravação composta, você deve ter um palco com publicadores ativos e um bucket do S3 para usá-lo como destino de gravação. Abaixo, descrevemos um possível fluxo de trabalho que usa eventos do EventBridge para registrar uma composição em um bucket do S3. Como alternativa, você pode iniciar e interromper as composições com base na lógica da sua própria aplicação.

1. Crie [um palco do IVS](getting-started-create-stage.md) e tokens de participante para cada publicador.

1. Crie um [EncoderConfiguration](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateEncoderConfiguration.html) (um objeto que representa como o vídeo gravado deve ser renderizado).

1. Crie um [bucket do S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) e uma [StorageConfiguration](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_CreateStorageConfiguration.html) (onde o conteúdo da gravação será armazenado).

   **Importante**: se você usar um bucket do S3 existente, a configuração de **Propriedade do objeto** deve ser **Imposta pelo proprietário do bucket** ou **Preferencial do proprietário do bucket**. Para obter detalhes, consulte a documentação do S3 sobre como [controlar a propriedade de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html).

1. [Entre no palco e publique nele](getting-started-pub-sub.md).

1. Ao receber um [evento do EventBridge](eventbridge.md) publicado pelo participante, chame [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html) com um objeto DestinationConfiguration do S3 como destino

1. Após alguns segundos, você verá os segmentos HLS como persistentes em seus buckets do S3.

![\[Como gravar um palco em um bucket do S3 usando a composição do servidor.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/images/Composite_Recording_Workflow.png)


**Obs.:** uma composição será desligada automaticamente após 60 segundos de inatividade dos participantes do publicador no palco. Nesse ponto, a composição será encerrada e passará para um estado `STOPPED`. Uma composição será excluída automaticamente após alguns minutos no estado `STOPPED`. Para obter detalhes, consulte [Ciclo de vida da composição](ssc-overview.md#ssc-composition-endpoint) em *Composição do servidor*.

## Exemplo de gravação composta: StartComposition com um destino de bucket do S3
<a name="comp-rec-example"></a>

O exemplo abaixo mostra uma chamada habitual para a operação [StartComposition](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_StartComposition.html), especificando o S3 como o único destino para a composição. Depois que a composição for transferida para um estado `ACTIVE`, os segmentos de vídeo e os metadados começarão a ser gravados no bucket do S3 especificado pelo objeto `storageConfiguration`. Para criar composições com layouts diferentes, consulte “Layouts” em [Composição do servidor](ssc-overview.md#ssc-api-layouts) e na [Referência da API de Transmissão em tempo real do IVS](https://docs.aws.amazon.com//ivs/latest/RealTimeAPIReference/API_LayoutConfiguration.html).

### Solicitação
<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"
}
```

### Resposta
<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": {}
    }
}
```

O campo `recordingPrefix`, presente na resposta StartComposition, pode ser usado para determinar onde o conteúdo da gravação será armazenado. 

## Conteúdo do registro
<a name="comp-rec-contents"></a>

Quando a composição passar para um estado `ACTIVE`, segmentos de vídeo HLS, arquivos de metadados e miniaturas (se configurados) começarão a ser gravados no bucket do S3 especificado durante a chamada StartComposition. Esse conteúdo está disponível para pós-processamento ou reprodução como vídeo sob demanda.

Observe que após a ativação de uma composição, um evento “Mudança no estado da composição do IVS” será emitido e poderá levar algum tempo antes que os segmentos de vídeo, miniaturas e arquivos de manifesto sejam gravados. Recomendamos que você reproduza ou processe transmissões gravadas somente após o recebimento do evento “Mudança no estado da composição do IVS (fim da sessão)”. Para mais detalhes, consulte [Usar o EventBridge com o streaming em tempo real do IVS](eventbridge.md)

Veja a seguir um exemplo de estrutura de diretório e conteúdo de uma gravação de uma sessão do IVS ao vivo:

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

A pasta `events` contém os arquivos de metadados correspondentes ao evento de gravação. Os arquivos de metadados JSON são gerados quando a gravação é iniciada, termina com êxito ou termina com falhas:
+ `events/recording-started.json`
+ `events/recording-ended.json`
+ `events/recording-failed.json`

Uma determinada pasta `events` vai conter `recording-started.json` e `recording-ended.json` ou `recording-failed.json`.

Elas contêm metadados relacionados à sessão gravada e seus formatos de saída. Os detalhes de JSON são fornecidos abaixo.

A pasta `media` contém o conteúdo de mídia compatível. A subpasta `hls` contém todos os arquivos de mídia e manifesto gerados durante a sessão de composição e pode ser reproduzida com o reprodutor do IVS. O manifesto HLS está localizado na pasta `multivariant.m3u8`. Se configuradas, as subpastas `thumbnails` e `latest_thumbnail` contêm arquivos de mídia em miniatura JPEG gerados durante a sessão de composição.

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

Quando um objeto StorageConfiguration for criado, o IVS terá acesso para gravar conteúdo no bucket do S3 especificado. Esse acesso é concedido por meio de modificações na política de bucket do S3. *Se a política do bucket for alterada de modo a remover o acesso do IVS, as gravações novas e contínuas falharão.*

O exemplo abaixo mostra uma política de bucket do S3 que permite que o IVS grave no bucket do 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"
                }
            }
        }
    ]
}
```

------

## Arquivos de metadados de JSON
<a name="comp-rec-json"></a>

Os metadados estão em formato JSON. Eles contêm as seguintes informações: 


| Campo | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
| `stage_arn` | string | Sim | ARN do palco que está sendo usado como origem da composição. | 
| `media` | objeto | Sim | Objeto que contém os objetos enumerados de conteúdo de mídia disponível para essa gravação. Valores válidos: `"hls"`.  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html) | objeto | Sim | Campo enumerado que descreve a saída do formato HLS da Apple. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | inteiro | Condicional | Duração do conteúdo de HLS gravado em milissegundos. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. Se ocorreu uma falha antes de qualquer gravação ter sido feita, é 0. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo S3 onde o conteúdo de HLS é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim |  Nome do arquivo da lista de reprodução principal de HLS.  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sim | Matriz de representações (variante de HLS) de objetos de metadados. Há sempre pelo menos uma representação. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo S3 em que o conteúdo de HLS é armazenado para essa versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Nome do arquivo da lista de reprodução de mídia para esta versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | inteiro | Condicional | Altura de resolução de pixels do vídeo codificado. Isso só estará disponível quando a versão contiver uma faixa de vídeo. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | inteiro | Condicional | Largura de resolução de pixels do vídeo codificado. Isso só estará disponível quando a versão contiver uma faixa de vídeo. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso está disponível somente quando o campo `storage` de configuração da miniatura incluir `SEQUENTIAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde o conteúdo da miniatura sequencial é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sim | Matriz de resoluções (variantes de miniaturas) de objetos de metadados. Há sempre pelo menos uma resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde o conteúdo da miniatura é armazenado para essa resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Altura da resolução em pixels das miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Largura da resolução em pixels das miniaturas. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso está disponível somente quando o campo `storage` de configuração da miniatura incluir `LATEST`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde `latest_thumbnail` é armazenado. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | objeto | Sim | Matriz de resoluções (variantes de miniaturas) de objetos de metadados. Há sempre pelo menos uma resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | string | Sim | Caminho relativo do prefixo do S3 onde a miniatura mais recente é armazenada para esta resolução. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Altura da resolução em pixels da miniatura mais recente. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/rt-composite-recording.html)  | int | Sim | Largura da resolução em pixels da miniatura mais recente. | 
| `recording_ended_at` | string | Condicional | Timestamp RFC 3339 UTC em que a gravação terminou. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. `recording_started_at` e `recording_ended_at` são timestamps quando esses eventos são gerados e podem não corresponder exatamente aos timestamps do segmento de vídeo HLS. Para determinar com precisão a duração de uma gravação, use o campo `duration_ms`.  | 
| `recording_started_at` | string | Condicional | Timestamp RFC 3339 UTC de quando a gravação foi iniciada. Isso não estará disponível quando `recording_status` for `RECORDING_START_FAILED`. Consulte a observação acima para `recording_ended_at`.  | 
| `recording_status` | string | Sim | O status da gravação. Valores válidos: `"RECORDING_STARTED"`, `"RECORDING_ENDED"`, `"RECORDING_START_FAILED"`, `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `recording_status_message` | string | Condicional | Informações descritivas sobre o status. Isso só está disponível quando `recording_status` é `"RECORDING_ENDED"` ou `"RECORDING_ENDED_WITH_FAILURE"`. | 
| `version` | string | Sim | A versão do esquema de metadados. | 

### Exemplo: 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
        }
      ]
    }
  }
}
```

### Exemplo: 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
        }
      ]
    }
  }
}
```

### Exemplo: 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
        }
      ]
    }
  }
}
```

## Reprodução de conteúdo gravado de buckets privados
<a name="comp-rec-playback"></a>

Por padrão, o conteúdo gravado é privado. Portanto, esses objetos são inacessíveis para reprodução usando o URL direto do S3. Ao tentar abrir a lista de reprodução multivariada HLS (arquivo m3u8) para reprodução usando o Reprodutor do IVS ou outro player, você receberá mensagem de um erro (p. ex., “Você não tem permissão para acessar o recurso solicitado”). Em vez disso, você pode reproduzir esses arquivos com a rede de entrega de conteúdo (CDN) do Amazon CloudFront.

As distribuições do CloudFront poderão ser configuradas para fornecer conteúdo de buckets privados. Normalmente, essa opção é preferível a ter buckets abertamente acessíveis nos quais as leituras ignoram os controles oferecidos pelo CloudFront. É possível configurar sua distribuição para fornecimento direto de um bucket privado ao criar um controle de acesso de origem (OAC), que é um usuário especial do CloudFront com permissões de leitura no bucket de origem privado. É possível criar o OAC após criar sua distribuição por meio do console ou da API do CloudFront. Consulte [Criar um novo controle de acesso de origem](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3) no *Guia do desenvolvedor do Amazon CloudFront*.

### Como configurar a reprodução usando o CloudFront com o CORS habilitado
<a name="comp-rec-playback-setup"></a>

Este exemplo mostra como um desenvolvedor pode configurar uma distribuição do CloudFront com o CORS habilitado, permitindo a reprodução de suas gravações diretamente de qualquer domínio. Isso é especialmente útil durante a fase de desenvolvimento, mas você pode modificar o exemplo abaixo para atender às suas necessidades de produção.

#### Etapa 1: Crie um bucket do S3
<a name="comp-rec-playback-setup-step1"></a>

Crie um bucket do S3 que será usado para armazenar as gravações. Observe que o bucket precisa estar na mesma região que você usa para seu fluxo de trabalho do IVS.

Adicione uma política CORS permissiva ao bucket:

1. No console da AWS, acesse a guia **Permissões de bucket do S3**.

1. Copie a política do CORS abaixo e cole-a em **Compartilhamento de recursos de origem cruzada (CORS**). Isso habilitará o acesso ao CORS no bucket do S3.

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

#### Etapa 2: Criar uma distribuição do CloudFront
<a name="comp-rec-playback-setup-step2"></a>

Consulte [Criação de uma distribuição do CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-creating-console.html) no *Guia do desenvolvedor do CloudFront*.

No Console da AWS, insira as seguintes informações:


| Para este campo… | Escolha isto... | 
| --- | --- | 
| Domínio de origem | O bucket do S3 que você criou na etapa anterior | 
| Acesso de origem | Configurações de controle de acesso de origem (recomendado) usando os parâmetros padrão | 
| Comportamento padrão do cache: política de protocolo do visualizador | Redirect HTTP to HTTPS | 
| Comportamento padrão do cache: métodos HTTP permitidos | GET, HEAD e OPTIONS | 
| Comportamento padrão do cache: chaves de cache e solicitações de origem | Política CachingDisabled | 
| Comportamento padrão do cache: política de solicitação de origem | CORS-S3Origin | 
| Comportamento padrão do cache: política de cabeçalhos de resposta | SimpleCORS | 
| Firewall da aplicação Web | Habilitar as proteções de segurança | 

Em seguida, salve a distribuição do CloudFront.

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

1. Exclua qualquer StorageConfiguration que você tenha configurado para o bucket do S3. Isso removerá todas as políticas de bucket que foram adicionadas automaticamente ao criar a política para esse bucket.

1. Acesse sua distribuição do CloudFront, verifique se todos os campos de distribuição estão nos estados definidos na etapa anterior e **copie a política do bucket** (use o botão **Copiar política**). 

1. Acesse seu bucket do S3. Na guia **Permissões**, selecione **Editar política de bucket** e cole a política de bucket que copiou na etapa anterior. Após essa etapa, a política de bucket deverá ter exclusivamente a política do CloudFront. 

1. Crie uma StorageConfiguration, especificando o bucket do S3.

Após a criação da configuração de armazenamento, você verá dois itens na política de bucket do S3, um permitindo que o CloudFront leia conteúdo e outro permitindo que o IVS grave conteúdo. Um exemplo de uma política de bucket final, com acesso ao CloudFront e IVS, é apresentado em [Exemplo: política de bucket do S3 com acesso do CloudFront e IVS](#comp-rec-playback-example).

#### Etapa 4: reproduzir gravações
<a name="comp-rec-playback-setup-step4"></a>

Após configurar com sucesso a distribuição do CloudFront e atualizar a política do bucket, você deverá conseguir reproduzir gravações usando o Reprodutor do IVS:

1. Inicie uma composição bem-sucedida e verifique se você tem uma gravação armazenada no bucket do S3.

1. Após seguir as etapas 1 a 3 neste exemplo, os arquivos de vídeo devem estar disponíveis para consumo por meio do URL do CloudFront. O URL do CloudFront é o **Nome de domínio da distribuição** na guia **Detalhes** no console do Amazon CloudFront. Será algo do tipo: 

   `a1b23cdef4ghij.cloudfront.net`

1. Para reproduzir o vídeo gravado por meio da distribuição do CloudFront, localize a chave de objeto para o arquivo `multivariant.m3u8` no bucket do s3. Será algo do tipo:

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

1. Acrescente a chave de objeto ao final do URL do CloudFront. O URL final será mais ou menos assim:

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

1. Agora, você pode adicionar o URL final ao atributo de origem de um Reprodutor do IVS para assistir à gravação completa. Para assistir ao vídeo gravado, você pode usar a demonstração em [Introdução](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/web-getting-started.html) no *SDK do Reprodutor do IVS: guia da Web*.

### Exemplo: política de bucket do S3 com acesso do CloudFront e IVS
<a name="comp-rec-playback-example"></a>

O trecho abaixo ilustra uma política de bucket do S3 que permite ao CloudFront ler conteúdo no bucket privado e ao IVS gravar conteúdo no bucket. **Obs.: não copie e cole o trecho abaixo em seu próprio bucket. Sua política deve conter as IDs relevantes para sua distribuição e configuração de armazenamento do CloudFront.**

------
#### [ 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"
        }
      }
    }
  ]
}
```

------

## Solução de problemas
<a name="comp-rec-troubleshooting"></a>
+ **A composição não é gravada no bucket do S3**: certifique-se de que o bucket do S3 e os objetos do StorageConfiguration estejam criados e estejam na mesma região. Além disso, certifique-se de que o IVS tenha acesso ao bucket verificando sua política de bucket. Consulte [Política de bucket para StorageConfiguration](#comp-rec-bucket-policy).
+ **Não consigo encontrar uma composição ao executar *ListCompositions***: as composições são recursos efêmeros. Após passarem para o estado final, elas serão excluídos automaticamente após alguns minutos.
+ **Minha composição para automaticamente:** uma composição será interrompida automaticamente se não houver um publicador no palco por mais de 60 segundos.

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

A playlist de mídia escrita por gravação composta terá a tag `#EXT-X-PLAYLIST-TYPE:EVENT` enquanto a composição estiver em andamento. Quando a composição for concluída, a tag será atualizada para `#EXT-X-PLAYLIST-TYPE:VOD`. Para uma experiência tranquila de reprodução, recomendamos que você use essa lista de reprodução somente depois que a composição for finalizada com sucesso.