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 |
|
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ãomaster.m3u8
e o manifesto habilitado para intervalo de bytesbyte-range-multivariant.m3u8
. Portanto, cada pasta de renderização tem tanto arquivosplaylist.m3u8
quantobyte-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 propriedadethumbnailConfiguration
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
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 |
---|---|---|---|
|
string | Sim | O ARN do canal que transmite o stream ao vivo. |
|
objeto | Sim | Objeto que contém os objetos enumerados de conteúdo de mídia disponível para essa gravação. Valores válidos: |
|
objeto | Sim | Campo enumerado que descreve a saída do formato HLS da Apple. |
|
inteiro | Condicional | Duração do conteúdo de HLS gravado em milissegundos. Isso só está disponível quando |
|
string | Sim | Caminho relativo do prefixo S3 onde o conteúdo de HLS é armazenado. |
|
string | Sim |
Nome do arquivo da lista de reprodução principal de HLS. |
|
string | Sim | Nome da lista de reprodução de intervalo de bytes HLS multivariada. |
|
objeto | Sim | Matriz de representações (variante de HLS) de objetos de metadados. Há sempre pelo menos uma representação. |
|
string | Sim | Caminho relativo do prefixo S3 em que o conteúdo de HLS é armazenado para essa versão. |
|
string | Sim | Nome do arquivo da lista de reprodução de mídia para esta versão. |
|
string | Sim | Nome da lista de reprodução de intervalo de bytes para esta versão. |
|
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. |
|
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. |
|
objeto | Condicional | Campo enumerado que descreve a saída de miniaturas. Isso só estará disponível quando a configuração em miniatura |
|
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 |
|
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 |
|
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 |
|
objeto | Sim | Campo enumerado que descreve a saída mais recente de miniaturas. Isso está disponível somente quando a configuração da miniatura |
|
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 |
|
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 |
|
string | Condicional | Carimbo de data/hora RFC 3339 UTC em que a gravação terminou. Isso só está disponível quando
|
|
string | Sim | Carimbo de data/hora RFC 3339 UTC de quando a gravação foi iniciada. Consulte a observação acima para |
|
string | Sim | O status da gravação. Valores válidos: |
|
string | Condicional | Informações descritivas sobre o status. Isso só está disponível quando |
|
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:
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.