Gravação automática do IVS no Amazon S3 | Streaming de baixa latência - Amazon IVS

Gravação automática do IVS no Amazon S3 | Streaming de baixa latência

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 em Conceitos básicos do Amazon IVS

A API do

Referência da API do IVS

Custos Custos do Amazon IVS

Prefixo do S3

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.

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

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.)

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

O recurso de gravação automática no S3 oferece suporte à geração de listas de reprodução de intervalo de bytes, 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 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.

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.

Mesclar streams fragmentados

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 em Conceitos básicos do Amazon IVS.

Elegibilidade

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.

  • Cada transmissão deve começar 10 segundos ou mais após a transmissão anterior.

Problema conhecido

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

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.)

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".

  • hls

objeto Sim

Campo enumerado que descreve a saída do formato HLS da Apple.

    • duration_ms

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.

    • path

string Sim

Caminho relativo do prefixo S3 onde o conteúdo de HLS é armazenado.

    • playlist

string Sim

Nome do arquivo da lista de reprodução principal de HLS.

    • byte_range_playlist

string Sim

Nome da lista de reprodução de intervalo de bytes HLS multivariada.

    • renditions

objeto Sim

Matriz de representações (variante de HLS) de objetos de metadados. Há sempre pelo menos uma representação.

      • path

string Sim

Caminho relativo do prefixo S3 em que o conteúdo de HLS é armazenado para essa versão.

      • playlist

string Sim

Nome do arquivo da lista de reprodução de mídia para esta versão.

      • byte_range_playlist

string Sim

Nome da lista de reprodução de intervalo de bytes para esta versão.

      • resolution_height

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.

      • resolution_width

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.

  • thumbnails

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.

    • path

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.

    • resolution_height

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 .

    • resolution_width

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.

  • latest thumbnail

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.

    • resolution_height

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.

    • resolution_width

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_started.json

{ "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_ended.json

{ "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_failed.json

{ "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

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 (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 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_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

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.) 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

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

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.

Reprodução pelo Amazon CloudFront

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

Para realizar a configuração do S3 CORS, consulte Configuração de CORS 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.