

# Gravação automática do IVS no Amazon S3 \$1 Streaming de baixa latência
<a name="record-to-s3"></a>

Esta seção fornece informações sobre o recurso auto-record-to-S3 do streaming de baixa latência do Amazon IVS. Discutimos o armazenamento de dados para transmissões registradas do Amazon IVS. Nós explicamos o conteúdo de armazenamento e o esquema do arquivo de metadados. Também discutimos a reprodução de seu conteúdo gravado.


| Para obter mais detalhes sobre… | Consulte … | 
| --- | --- | 
| Configurar e interromper a gravação de vídeo |   [Criar um canal com gravação opcional](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/getting-started-create-channel.html) em *Conceitos básicos do Amazon IVS* | 
| A API do |  [Referência da API do IVS](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/Welcome.html) | 
| Custos |  [Custos do Amazon IVS](https://docs.aws.amazon.com//ivs/latest/LowLatencyUserGuide/costs.html) | 

## Prefixo do S3
<a name="r2s3-prefix"></a>

O prefixo S3 é uma estrutura de diretório exclusiva para cada stream ao vivo gravado. Todos os arquivos de mídia e metadados para a tranmissão ao vivo são gravados nesse diretório. Para canais com gravação habilitada, o prefixo S3 é gerado quando uma sessão ao vivo é iniciada e será fornecido no evento CloudWatch no início e no fim de uma gravação.

O prefixo S3 tem o formato a seguir:

```
/ivs/v1/<aws_account_id>/<channel_id>/<year>/<month>/<day>/<hours>/<minutes>/<recording_id>
```

Em que:
+ `aws_account_id` é o ID da sua conta da AWS (gerado quando você criou uma conta da AWS), do qual o canal é criado.
+ `channel_id` é a parte do ID do recurso do ARN do canal (a última parte do Nome do recurso da Amazon). Consulte o ARN no [Glossário](ivs-glossary.md).
+ `<year>/<month>/<day>/<hours>/<minutes>` é um timestamp UTC quando a gravação é iniciada.
+ `recording_id` é um ID exclusivo gerado para cada sessão de gravação.

Por exemplo:

```
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs
```

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

Quando a gravação é iniciada, os segmentos de vídeo e os arquivos de metadados são gravados no bucket do S3 configurado para o canal. Esses conteúdos estão disponíveis para pós-processamento ou reprodução como vídeo sob demanda.

Observe que depois que um fluxo ao vivo é iniciado e o evento Início de gravação do EventBridge é emitido, leva algum tempo antes que os arquivos de manifesto e os segmentos de vídeo sejam gravados. Recomendamos que você reproduza ou processe streams gravados somente após o evento Fim da gravação ser enviado. (Consulte [Uso do Amazon EventBridge com o 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 Amazon IVS ao vivo:

```
ivs/v1/123456789012/AsXego4U6tnj/2020/6/23/20/12/j8Z9O91ndcVs/
   events
      recording-started.json
      recording-ended.json
   media
      hls
      thumbnails
```

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 todo o conteúdo de mídia suportado, em duas subpastas:
+ `hls` contém todos os arquivos de mídia e manifesto gerados durante a sessão ao vivo e podem ser reproduzidos com o player do Amazon IVS. Existem dois tipos de manifestos HLS nesta pasta, o manifesto mestre padrão `master.m3u8` e o manifesto habilitado para intervalo de bytes `byte-range-multivariant.m3u8`. Portanto, cada pasta de renderização tem tanto arquivos `playlist.m3u8` quanto `byte-range-variant.m3u8`. (Consulte as [Listas de reprodução de intervalo de bytes](#r2s3-byte-range-playlists) abaixo.)
+ `thumbnails` contém imagens em miniatura geradas durante a sessão ao vivo. As miniaturas são geradas e gravadas no bucket a cada minuto. Para alterar esse comportamento, substitua a propriedade `thumbnailConfiguration` em uma configuração de gravação.

**Importante:** o conteúdo dentro da pasta `media` é gerado dinamicamente e determinado pelas características dos primeiros segmentos de vídeo recebidos; o conteúdo da pasta pode não representar as características finais (por exemplo, qualidade de representação). *Não faça quaisquer suposições sobre o caminho estático.* Para descobrir as renderizações HLS disponíveis e seu caminho, use os arquivos de metadados JSON descritos abaixo.

## Listas de reprodução de intervalo de bytes
<a name="r2s3-byte-range-playlists"></a>

O recurso de gravação automática no S3 oferece suporte à geração de [listas de reprodução de intervalo de bytes](https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.2.2), além das listas de reprodução HLS padrão. As listas de reprodução de intervalo de bytes estão em conformidade com a versão 4 da especificação HLS. Isso permite um recorte de conteúdo mais detalhado: em uma lista de reprodução de intervalo de bytes, cada segmento em um arquivo de índice de renderização faz referência a um subintervalo de bytes de um bloco de vídeo, fornecendo mais granularidade do que o tamanho de arquivo de mídia padrão de dez segundos. Com uma lista de reprodução de intervalo de bytes, a duração do segmento é a mesma do intervalo do quadro-chave configurado para o fluxo.

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

A propriedade `thumbnailConfiguration` em uma configuração de gravação permite habilitar/desabilitar a gravação de miniaturas para uma sessão ao vivo e modificar o intervalo no qual as miniaturas são geradas para a sessão ao vivo. Os intervalos das miniaturas podem variar de 1 segundo a 60 segundos. Por padrão, a gravação de miniaturas está habilitada, em um intervalo de 60 segundos. Para obter detalhes, consulte a [Referência de API do Streaming de baixa latência do Amazon IVS](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/Welcome.html).

A configuração da miniatura também pode incluir o campo `storage` (`SEQUENTIAL` e/ou `LATEST`) e uma resolução (`LOWEST_RESOLUTION`, `SD`, `HD` ou `FULL_HD`). Abaixo estão as resoluções para cada opção: 

160 <= `LOWEST_RESOLUTION` <= 360

360 < `SD` <= 480

480 < `HD` <= 720

720 < `FULL_HD` <= 1080

Caso a `resolution` não seja definida para um fluxo que esteja usando entrada de vídeo com várias faixas, as miniaturas de todas as representações serão gravadas. Para obter informações sobre várias faixas, consulte [Vídeo com várias faixas](multitrack-video.md).

## Mesclar streams fragmentados
<a name="r2s3-merge-fragmented-streams"></a>

A propriedade `recordingReconnectWindowSeconds` em uma configuração de gravação permite especificar uma janela de tempo (em segundos) durante a qual, se o stream for interrompido e um novo stream for iniciado, o Amazon IVS tentará gravar com o mesmo prefixo do S3 do stream anterior. Em outras palavras, se uma transmissão se desconectar e depois se reconectar dentro do intervalo especificado, os vários streams serão considerados uma única transmissão e mesclados uns com os outros.

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

Para obter instruções de configuração da funcionalidade de mesclagem de streams, consulte [Etapa 4: criar um canal com gravação opcional](getting-started-create-channel.md) em *Conceitos básicos do Amazon IVS*.

### Elegibilidade
<a name="r2s3-merge-fragmented-streams-eligibility"></a>

Para que vários streams sejam gravados com o mesmo prefixo do S3, algumas condições devem ser atendidas para todos os streams: 
+ A largura e a altura do vídeo devem ser iguais.
+ A taxa de quadros deve ser a mesma.
+ A diferença da taxa de bits das transmissões subsequentes deve ser menor ou igual a 50% da taxa de bits da transmissão original.
+ Os codecs de vídeo e áudio devem ser os mesmos.

**Observações:**
+ No máximo 20 streams são mesclados, após os quais um novo prefixo do S3 é criado.
+ Decorridas 48 horas, um novo prefixo do S3 é criado. Por exemplo, se a primeira transmissão durar 48 horas e outra transmissão for iniciada dentro do intervalo `recordingReconnectWindowSeconds`, a próxima transmissão *não será* mesclada no primeiro prefixo do S3.
+ Reconexões rápidas podem resultar no início de uma nova transmissão antes que a transmissão anterior termine de gravar no S3. Nesse caso, a nova transmissão *não é* mesclada no prefixo do S3 anterior. (Normalmente, a gravação no S3 é concluída dentro de 10 segundos após o término da transmissão.) Reconexões rápidas podem ocorrer em vários cenários, incluindo: 1) transições rápidas de segundo plano/primeiro plano da aplicação móvel, 2) quando a aquisição do stream não é possível ao usar o recurso de reconexão automática dos SDKs de transmissão móvel do IVS e 3) quando chamar [StopStream](https://docs.aws.amazon.com//ivs/latest/LowLatencyAPIReference/API_StopStream.html) aciona uma reconexão automática do software cliente de streaming.

### Problema conhecido
<a name="r2s3-merge-fragmented-streams-known-issue"></a>

Se a opção `recordingReconnectWindowSeconds` estiver habilitada e o Web Broadcast SDK for usado, gravar com o mesmo prefixo do S3 poderá não funcionar, pois o Web Broadcast SDK alterará dinamicamente as taxas de bits e as qualidades.

## Arquivos de metadados de JSON
<a name="r2s3-json-metadata"></a>

Quando ocorre um evento de alteração de estado de gravação, uma métrica correspondente do Amazon CloudWatch é gerada e um arquivo de metadados é gravado no prefixo S3. (Consulte [Monitoramento do streaming de baixa latência do Amazon IVS](stream-health.md).)

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


| Campo | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
| `channel_arn` | string | Sim | O ARN do canal que transmite o stream ao vivo. | 
| `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"`, `"thumbnails"`. | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.html)  | string | Sim | Nome da lista de reprodução de intervalo de bytes HLS multivariada. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.html)  | string | Sim | Nome da lista de reprodução de intervalo de bytes para esta versão. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.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/LowLatencyUserGuide/record-to-s3.html)  | objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso só estará disponível quando a configuração em miniatura `recordingMode` for `INTERVAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | string | Condicional | Caminho relativo do prefixo S3 onde o conteúdo da miniatura é armazenado. Isso só estará disponível quando a configuração em miniatura `recordingMode` for `INTERVAL`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Sim | A altura da miniatura. Por padrão, corresponde à resolução da representação da origem. Este valor é afetado pela entrada do usuário na configuração de gravação relacionada, especificamente, o valor `thumbnailConfiguration.resolution `. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Sim | A largura da miniatura. Por padrão, corresponde à resolução da representação da origem. Este valor é afetado pela entrada do usuário na configuração de gravação relacionada, especificamente, o valor `thumbnailConfiguration.resolution`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | objeto | Sim | Campo enumerado que descreve a saída mais recente de miniaturas. Isso está disponível somente quando a configuração da miniatura `storage` incluir `LATEST`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Sim | A altura da miniatura. O padrão será a resolução da representação da origem. Este valor é afetado pela entrada do usuário na configuração de gravação relacionada, especificamente, o valor `thumbnailConfiguration.resolution`. | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/record-to-s3.html)  | int | Sim | A largura da miniatura. O padrão será a resolução da representação da origem. Este valor é afetado pela entrada do usuário na configuração de gravação relacionada, especificamente, o valor `thumbnailConfiguration.resolution`. | 
| `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 | Sim | Timestamp RFC 3339 UTC de quando a gravação foi iniciada. 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_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\$1started.json
<a name="r2s3-json-metadata-recording-started"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status : "RECORDING_STARTED",
   "media": {
      "hls": {
         "path": "media/hls",
         "playlist": "master.m3u8",
         "byte_range_playlist": "byte-range-multivariant.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "360p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 360,
               "resolution_width": 640
            },
            {
               "path": "160p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 160,
               "resolution_width": 284
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

### Exemplo: recording\$1ended.json
<a name="r2s3-json-metadata-recording-ended"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_ended_at": "2020-06-14T12:53:20Z",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status": "RECORDING_ENDED",
   "media": {
      "hls": {
         "duration_ms": 172794489,
         "path": "media/hls",
         "playlist": "master.m3u8",
         "byte_range_playlist": "byte-range-multivariant.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "360p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 360,
               "resolution_width": 640
            },
            {
               "path": "160p30",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 160,
               "resolution_width": 284
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "byte_range_playlist": "byte-range-variant.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

### Exemplo: recording\$1failed.json
<a name="r2s3-json-metadata-recording-failed"></a>

```
{
   "version": "v1",
   "channel_arn": "arn:aws:ivs:us-west-2:123456789012:channel/AsXego4U6tnj",
   "recording_ended_at": "2020-06-14T12:53:20Z",
   "recording_started_at": "2020-06-12T12:53:26Z",
   "recording_status": "RECORDING_ENDED_WITH_FAILURE",
   "recording_status_message": "InternalServerException",
   "media": {
      "hls": {
         "duration_ms": 172794489,
         "path": "media/hls",
         "playlist": "master.m3u8",
         "renditions": [
            {
               "path": "480p30",
               "playlist": "playlist.m3u8",
               "resolution_height": 480,
               "resolution_width": 852
            },
            {
               "path": "720p60",
               "playlist": "playlist.m3u8",
               "resolution_height": 720,
               "resolution_width": 1280
            }
         ]
      },
      "thumbnails": {
         "path": "media/thumbnails",
         "resolution_height": 480,
         "resolution_width": 852
      },
      "latest_thumbnail": {
         "path": "media/latest_thumbnail/thumb.jpg",
         "resolution_height": 480,
         "resolution_width": 852
      }
   }
}
```

## Como descobrir as representações de uma gravação
<a name="r2s3-recording-renditions"></a>

Quando você transmite conteúdo para um canal do Amazon IVS, o auto-record-to-s3 usa o vídeo de origem para gerar várias representações. Com o uso da [Streaming de bits adaptável](player.md) (ABR), o Player do Amazon IVS alterna automaticamente as representações (taxas de bits), conforme necessário, para otimizar a reprodução para condições de rede variáveis.

Cada representação gerada durante o streaming ao vivo é gravada em um caminho exclusivo dentro do prefixo de gravação S3. Os detalhes de resolução, caminho e nomes dos arquivos da lista de reprodução são armazenados em um [arquivo JSON de metadados](#r2s3-json-metadata) durante o início e o término da gravação. Se o valor `renditionSelection` da configuração de gravação for `ALL`, todas as representações serão selecionadas para gravação. Se `renditionSelection` for `CUSTOM`, o usuário deverá selecionar uma ou mais das seguintes opções: `LOWEST_RESOLUTION`, `SD`, `HD` e FULL\$1HD. Abaixo estão as resoluções para cada opção:

160 <= `LOWEST_RESOLUTION` <= 360

360 < `SD` <= 480

480 < `HD` <= 720

720 < `FULL_HD` <= 1080

**Importante:** *não* execute nenhuma suposição sobre o caminho de representação estática ou a lista de representações geradas, pois elas estão sujeitas a alterações. *Não* assuma que uma representação específica estará sempre disponível para uma gravação do Amazon IVS. Para determinar as versões, resoluções e caminhos disponíveis, consulte os arquivos de metadados.

O `event/recording_started.json` ou `event/recording_ended.json` dentro do prefixo de gravação contém os caminhos e nomes dos arquivos de mídia no prefixo de gravação. Todos os elementos `path` são relativos ao caminho anterior na hierarquia. Elementos sob `media > hls` descrevem os ativos de HLS, com o nome da lista de reprodução principal e o caminho definidos nesse nível.

Aqui está um snippet de código Python que mostra como gerar um caminho principal da lista de reprodução usando o prefixo de gravação do S3 e o arquivo de metadados:

```
def get_master_playlist(metadata_json, s3_recording_prefix):
   return s3_recording_prefix + '/' + metadata_json['media']['hls']['path'] + '/' + metadata_json['media']['hls']['playlist']
```

Elementos sob `media > hls > renditions` descrevem a lista de versões registradas. O `resolution_height` e `resolution_width` podem ser usadas para identificar a resolução do vídeo. Os elemento `path` e `playlist` podem ser usados para derivar o caminho da lista de reprodução da versão. Use esses campos para determinar qual versão usar para qualquer pós-processamento.

Para descobrir a lista de reprodução mais alta disponível para uma gravação, você pode se inscrever para eventos de EventBridge “Alteração do estado de gravação do IVS”. (Consulte [Uso do Amazon EventBridge com o IVS](eventbridge.md).) Abaixo está um script de Python de exemplo que ilustra o uso de uma função lambda inscrita nesses eventos.

```
import json
import boto3
s3 = boto3.resource('s3')

def get_highest_rendition_playlist(bucket_name, prefix_name):
   object_path = "{}/events/recording-started.json".format(prefix_name)
   object = s3.Object(bucket_name, object_path)
   body = str(object.get()['Body'].read().decode('utf-8'))
   metadata = json.loads(body)
   media_path = metadata["media"]["hls"]["path"]
   renditions = metadata["media"]["hls"]["renditions"]

   highest_rendition = None
   highest_rendition_size = 0

   for rendition in renditions:
       current_rendition_size = rendition["resolution_height"]
       if (current_rendition_size > highest_rendition_size):
           highest_rendition_size = current_rendition_size
           highest_rendition = rendition

   highest_rendition_playlist = media_path + '/' + highest_rendition['path'] + '/' + highest_rendition['playlist']
   return highest_rendition_playlist


def lambda_handler(event, context):
   prefix_name = event["detail"]["recording_s3_key_prefix"]
   bucket_name = event["detail"]["recording_s3_bucket_name"]
   rendition_playlist = get_highest_rendition_playlist(bucket_name, prefix_name)
   print("Highest rendition playlist: {}/{}".format(prefix_name, rendition_playlist))

   return {
       'statusCode': 200,
       'body': rendition_playlist
   }
```

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

Os objetos registrados com o recurso Auto-Record no Amazon S3 são privados por padrão. Portanto, esses objetos são inacessíveis para reprodução usando o URL direto do S3. Ao tentar abrir o manifesto principal HLS (arquivo m3u8) para reprodução usando o Amazon IVS Player ou outro player, você receberá mensagem de um erro, como: “You do not have permission to access the requested resource” (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.

### Distribuição do Amazon CloudFront
<a name="r2s3-cdn-oai"></a>

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. Sua distribuição pode ser configurada para atender a partir 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 controle de acesso à origem](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#create-oac-overview-s3).

### Reprodução pelo Amazon CloudFront
<a name="r2s3-cdn-playback"></a>

Após configurar a distribuição usando um OAC para obter acesso ao bucket privado, seus 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 AWS CloudFront. Será algo do tipo:

a1b23cdef4ghij.cloudfront.net.

Para transmitir o vídeo gravado por meio de sua distribuição, localize a chave de objeto para o arquivo `master.m3u8`. Será algo do tipo:

```
ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
```

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

```
https://a1b23cdef4ghij.cloudfront.net/ivs/v1/012345678912/a0bCDeFGH1IjK/2021/4/20/12/03/aBcdEFghIjkL/media/hls/master.m3u8
```

Para reproduzir em um navegador da Web, certifique-se de configurar o CORS no CloudFront e no bucket do S3. Para a configuração do CloudFront, siga as instruções em [Criar políticas de solicitação de origem](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) para anexar uma política de solicitação **CORS-S3 Origin** e uma política de cabeçalho de resposta **SimpleCORS** à distribuição do CloudFront. Veja a página de exemplo do console de configuração abaixo:

![\[Página de exemplo do console de configuração. Recomendamos usar uma política de cache e uma política de solicitação de origem para controlar a chave de cache e as solicitações de origem.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/LowLatencyUserGuide/images/CORS_Configuration.png)


Para realizar a configuração do S3 CORS, consulte [Configuração de CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) para criar regras apropriadas para seu bucket do S3.

Agora será possível reproduzir seu vídeo gravado como se estivesse reproduzindo diretamente de um bucket.

Para obter mais informações, consulte [Restringir o acesso a uma origem do Amazon S3](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html).