Gravação automática no Amazon S3 (streaming de baixa latência) - Amazon Interactive Video Service

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Gravação automática 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 ativada, o prefixo S3 é gerado quando uma sessão ao vivo começa e será fornecido no CloudWatch evento no início e no final 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 carimbo de data/hora 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, após o início de uma transmissão ao vivo e a emissão do EventBridge evento Recording Start, leva algum tempo até 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 Usando a Amazon EventBridge com 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 auto-record-to -S3 suporta a geração de playlists por faixa de bytes, além das playlists 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 da API 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

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 alteração do estado de gravação do IVS na Amazon EventBridge: os eventos finais de gravação e os arquivos de metadados JSON encerrados com a gravação estão atrasados pelo menos, recordingReconnectWindowSeconds pois o Amazon IVS espera garantir que uma nova transmissão não seja iniciada.

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 mudança de estado de gravação, uma CloudWatch métrica correspondente da Amazon é gerada e um arquivo de metadados é gravado dentro do 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

Carimbo de data/hora 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 carimbos de data/hora quando esses eventos são gerados e podem não corresponder exatamente aos carimbos de data/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_started_at

string Sim

Carimbo de data/hora 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", "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 } } }

Como descobrir as versões de uma gravação

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

Cada versã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 versões geradas, pois estas 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 playlist de rendição mais alta disponível para uma gravação, você pode se inscrever nos eventos “IVS Recording State Change”. EventBridge (Consulte Usando a Amazon EventBridge com 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 o Amazon CloudFront CDN (Content Delivery Network).

CloudFront Distribuição da Amazon

CloudFront as distribuições podem ser configuradas para fornecer conteúdo de buckets privados. Normalmente, isso é preferível a ter buckets de acesso aberto, onde as leituras ignoram os controles oferecidos por. CloudFront Sua distribuição pode ser configurada para atender a partir de um bucket privado criando um controle de acesso de origem (OAC), que é um CloudFront usuário especial que tem permissões de leitura no bucket de origem privado. Você pode criar o OAC depois de criar sua distribuição, por meio do CloudFront console ou da API. Consulte Criar um controle de acesso à origem.

Reprodução da Amazon CloudFront

Depois de configurar sua distribuição usando um OAC para obter acesso ao seu bucket privado, seus arquivos de vídeo devem estar disponíveis para consumo por meio do CloudFront URL. Seu CloudFront URL é o nome do domínio de distribuição na guia Detalhes no CloudFront console da AWS. 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

Anexe a chave do objeto ao final do seu CloudFront URL. 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 a partir de um navegador da web, certifique-se de configurar o CORS em ambos CloudFront e no bucket do S3. Para CloudFront configuração, siga as instruções em Criação de políticas de solicitação de origem para anexar uma política de solicitação de origem CORS-S3 e uma política de cabeçalho de resposta SimpleCORS à distribuição. 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 você poderá 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.