Registrazione automatica su Amazon S3 (streaming a bassa latenza) - Amazon Interactive Video Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Registrazione automatica su Amazon S3 (streaming a bassa latenza)

Questa sezione fornisce informazioni sulla funzionalità auto-record-to -S3 dello streaming a bassa latenza di Amazon IVS. Esaminiamo l'archiviazione dati per i flussi Amazon IVS registrati. Spieghiamo i contenuti dell'archiviazione e lo schema dei file di metadati. Inoltre, illustriamo la riproduzione dei contenuti registrati.

Per informazioni dettagliate su… Consultare…

Impostazione e interruzione della registrazione video

Creazione di un canale con registrazione opzionale in Nozioni di base su Amazon IVS

L'API

IVS API Reference (Documentazione di riferimento delle API di IVS)

Costi Costi di Amazon IVS

Prefisso S3

Il prefisso S3 è una struttura di directory univoca per ogni live streaming registrato. Tutti i file multimediali e metadati per il live streaming sono scritti all'interno di questa directory. Per i canali con registrazione abilitata, il prefisso S3 viene generato all'inizio di una sessione live e verrà fornito all'inizio e alla fine di CloudWatch una registrazione.

Il prefisso S3 ha il seguente formato:

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

Dove:

  • aws_account_id è l'ID dell'account AWS (generato alla creazione di un account AWS), da cui viene creato il canale.

  • channel_id è la parte dell'ID risorsa dell'ARN del canale (l'ultima parte dell'Amazon Resource Name). Consultare la sezione relativa agli ARN nella Glossario.

  • <year>/<month>/<day>/<hours>/<minutes> è un timestamp UTC all'avvio della registrazione.

  • recording_id è un ID univoco generato per ogni sessione di registrazione.

Ad esempio:

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

Contenuto della registrazione

All'avvio della registrazione, i segmenti video e i file di metadati vengono scritti nel bucket S3 configurato per il canale. Questi contenuti sono disponibili per la post-elaborazione o la riproduzione come video on demand.

Nota che dopo l'avvio di un live streaming e l'emissione dell' EventBridge evento Recording Start, occorre un po' di tempo prima che i file manifest e i segmenti video vengano scritti. Consigliamo di riprodurre o elaborare flussi registrati solo dopo l'invio dell'evento di fine registrazione. Consultare Usare Amazon EventBridge con IVS.

Di seguito è riportato un esempio di struttura di directory e contenuto di una registrazione di una sessione Amazon IVS live:

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

La cartella events contiene i file di metadati corrispondenti all'evento di registrazione. I file di metadati JSON vengono generati quando la registrazione inizia, termina correttamente o termina con errori:

  • events/recording-started.json

  • events/recording-ended.json

  • events/recording-failed.json

Una determinata cartella events conterrà recording-started.json e recording-ended.json o recording-failed.json.

Questi contengono metadati relativi alla sessione registrata e ai relativi formati di output. I dettagli JSON sono riportati di seguito.

La cartella media contiene tutti i contenuti multimediali supportati in due sottocartelle:

  • hls contiene tutti i file multimediali e i file manifest generati durante la sessione live ed è riproducibile con il lettore Amazon IVS. Esistono due tipi di manifesti HLS in questa cartella: il manifesto principale standard master.m3u8 e il manifesto abilitato per intervalli di byte byte-range-multivariant.m3u8. Pertanto, ogni cartella di rendering contiene sia un file playlist.m3u8 sia un file byte-range-variant.m3u8. Consulta la sezione sulle Playlist con intervalli di byte di seguito.

  • thumbnails contiene immagini in miniatura generate durante la sessione live. Le miniature vengono generate e scritte nel bucket ogni minuto. (Per modificare questo comportamento, sovrascrivere la proprietà thumbnailConfiguration su una configurazione di registrazione.)

Importante: i contenuti all'interno della cartella media vengono generati dinamicamente e sono determinati dalle caratteristiche dei primi segmenti video ricevuti; il contenuto della cartella potrebbe non rappresentare le caratteristiche finali (ad esempio, la qualità del rendering). Non fare ipotesi sul percorso statico. Per scoprire i rendering HLS disponibili e il relativo percorso, utilizza i file di metadati JSON descritti di seguito.

Playlist con intervalli di byte

La funzione auto-record-to -S3 supporta la generazione di playlist con intervallo di byte, oltre alle playlist HLS standard. Le playlist con intervalli di byte sono conformi alla versione 4 della specifica HLS. Ciò consente di ritagliare i contenuti in modo più granulare: in una playlist con intervalli di byte, ogni segmento di un file di indice di rendering fa riferimento a un sottointervallo di byte di un blocco video, fornendo una maggiore granularità rispetto alla dimensione standard di un file multimediale, pari a 10 secondi. Con una playlist con intervallo di byte, la durata del segmento è la stessa dell'intervallo di fotogrammi chiave configurato per lo streaming.

Anteprime

La proprietà thumbnailConfiguration in una configurazione di registrazione consente di abilitare o disabilitare la registrazione delle anteprime per una sessione live e modificare l'intervallo in cui vengono generate le anteprime per la sessione live. Gli intervalli delle miniature possono variare da 1 secondo a 60 secondi; per impostazione predefinita, la registrazione delle miniature è abilitata a un intervallo di 60 secondi. Per informazioni dettagliate, consultare l'Amazon IVS API Reference (Documentazione di riferimento delle API di Amazon IVS).

La configurazione delle miniature può includere anche il campo storage (SEQUENTIAL e/o LATEST) e una risoluzione (LOWEST_RESOLUTIONSDHD oppure FULL_HD). Di seguito sono elencate le risoluzioni per ciascuna opzione:

160 <= LOWEST_RESOLUTION <= 360

360 < SD <= 480

480 < HD <= 720

720 < FULL_HD <= 1.080

Merge Fragmented Streams (Unione flussi frammentati)

La proprietà recordingReconnectWindowSeconds su una configurazione di registrazione consente di specificare un intervallo di tempo (in secondi) durante il quale, se il flusso si interrompe e se ne avvia un altro, Amazon IVS tenta di registrare con lo stesso prefisso S3 del flusso precedente. In altre parole, se una trasmissione si disconnette e riconnette entro l'intervallo specificato, i flussi multipli vengono considerati un'unica trasmissione e uniti.

Eventi di modifica dello stato di registrazione IVS in Amazon EventBridge: gli eventi di fine registrazione e i file di metadati JSON con termine di registrazione vengono ritardati almeno di, recordingReconnectWindowSeconds poiché Amazon IVS attende per assicurarsi che non venga avviato un nuovo stream.

Per istruzioni sull'impostazione della funzionalità di unione dei flusso, consultare Fase 4: Creazione di un canale con registrazione facoltativa in Nozioni di base su Amazon IVS.

Idoneità

Affinché più flussi siano registrati sullo stesso prefisso S3, devono essere soddisfatte alcune condizioni per tutti i flussi:

  • La larghezza e l'altezza del video devono essere le stesse.

  • La frequenza dei fotogrammi deve essere la stessa.

  • La differenza di bitrate dei flussi successivi deve essere inferiore o uguale al 50% del bitrate del flusso originale.

  • I codec video e audio devono essere gli stessi.

Note:

  • È possibile unire al massimo 20 flussi, dopodiché viene creato un nuovo prefisso S3.

  • Dopo 48 ore viene creato un nuovo prefisso S3. Ad esempio, se la prima trasmissione dura 48 ore e un'altra trasmissione viene avviata entro l'intervallo dei recordingReconnectWindowSeconds, la trasmissione successiva non viene unita nel primo prefisso S3.

  • Ogni stream deve iniziare 10 o più secondi dopo lo stream precedente.

Problema noto

Se recordingReconnectWindowSeconds è abilitato e si utilizza l'SDK di trasmissione Web, la registrazione con lo stesso prefisso S3 potrebbe non funzionare, poiché l'SDK di trasmissione Web modifica dinamicamente bitrate e qualità.

File di metadati JSON

Quando si verifica un evento di modifica dello stato di registrazione, viene generata una CloudWatch metrica Amazon corrispondente e viene scritto un file di metadati all'interno del prefisso S3. (Consulta Monitoraggio dello streaming a bassa latenza di Amazon IVS.)

Questi metadati sono in formato JSON. Essi contengono le seguenti informazioni:

Campo Tipo Campo obbligatorio Descrizione

channel_arn

stringa L'ARN del canale che trasmette il live streaming.

media

oggetto

L'oggetto che contiene gli oggetti enumerati del contenuto multimediale disponibile per la registrazione. Valori validi: "hls", "thumbnails".

  • hls

oggetto

Il campo enumerato che descrive l'output in formato Apple HLS.

    • duration_ms

intero Condizionale

La durata del contenuto HLS registrato, in millisecondi. Questo valore è disponibile solo quando recording_status è "RECORDING_ENDED" o"RECORDING_ENDED_WITH_FAILURE". Se prima di una registrazione si è verificato un errore, allora sarà uguale a 0.

    • path

stringa

Il percorso relativo dal prefisso S3 in cui è memorizzato il contenuto HLS.

    • playlist

stringa

Il nome del file della playlist principale HLS.

    • byte_range_playlist

string

Il nome della playlist multivariante con intervallo di byte HLS.

    • renditions

oggetto

L'array di rendering (variante HLS) di oggetti di metadati. È presente sempre almeno un rendering.

      • path

stringa

Il percorso relativo dal prefisso S3 in cui è memorizzato il contenuto HLS per questo rendering.

      • playlist

stringa

Il nome del file della playlist multimediale per questo rendering.

      • byte_range_playlist

string

Il nome della playlist con intervalli di byte per questo rendering.

      • resolution_height

int Condizionale

L'altezza della risoluzione in pixel del video codificato. Questa opzione è disponibile solo quando il rendering contiene una traccia video.

      • resolution_width

int Condizionale

La larghezza della risoluzione in pixel del video codificato. Questa opzione è disponibile solo quando il rendering contiene una traccia video.

  • thumbnails

oggetto Condizionale

Il campo enumerato che descrive l'output delle miniature. Questa opzione è disponibile solo quando la configurazione recordingMode della anteprima è INTERVAL.

    • path

string Condizionale

Il percorso relativo dal prefisso S3 in cui è memorizzato il contenuto delle miniature. Questa opzione è disponibile solo quando la configurazione recordingMode della anteprima è INTERVAL.

    • resolution_height

int

L'altezza della miniatura. Impostazione predefinita: risoluzione del rendering dell'origine. Questo valore è influenzato dall'input dell'utente nella relativa configurazione di registrazione; in particolare, il valore thumbnailConfiguration.resolution .

    • resolution_width

int

La larghezza della miniatura. Impostazione predefinita: risoluzione del rendering dell'origine. Questo valore è influenzato dall'input dell'utente nella relativa configurazione di registrazione; in particolare, il valore thumbnailConfiguration.resolution.

  • latest thumbnail

oggetto

Il campo enumerato che descrive l'output dell'ultima miniatura. Questa opzione è disponibile solo quando storage della configurazione della miniatura include LATEST.

    • resolution_height

int

L'altezza della miniatura. L'impostazione predefinita sarà la risoluzione del rendering dell'origine. Questo valore è influenzato dall'input dell'utente nella relativa configurazione di registrazione; in particolare, il valore thumbnailConfiguration.resolution.

    • resolution_width

int

La larghezza della miniatura. L'impostazione predefinita sarà la risoluzione del rendering dell'origine. Questo valore è influenzato dall'input dell'utente nella relativa configurazione di registrazione; in particolare, il valore thumbnailConfiguration.resolution.

recording_ended_at

string Condizionale

Il timestamp UTC di RFC 3339 quando la registrazione termina. Questo valore è disponibile solo quando recording_status è "RECORDING_ENDED" o"RECORDING_ENDED_WITH_FAILURE".

recording_started_at e recording_ended_at sono timestamp quando questi eventi vengono generati e potrebbero non corrispondere esattamente ai timestamp del segmento video HLS. Per determinare con precisione la durata di una registrazione, utilizzare il campo duration_ms.

recording_started_at

string

Il timestamp UTC di RFC 3339 quando la registrazione inizia.

Consultare la nota sopra per recording_ended_at.

recording_status

string

Lo stato della registrazione. Valori validi: "RECORDING_STARTED", "RECORDING_ENDED", "RECORDING_ENDED_WITH_FAILURE".

recording_status_message

string Condizionale

Le informazioni descrittive sullo stato. Questo valore è disponibile solo quando recording_status è "RECORDING_ENDED" o"RECORDING_ENDED_WITH_FAILURE".

version

string

La versione dello schema dei metadati.

Esempio: 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 } } }

Esempio: 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 } } }

Esempio: 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 } } }

Individuazione dei rendering di una registrazione

Quando trasmetti contenuti in streaming su un canale Amazon IVS, auto-record-to-s 3 utilizza il video sorgente per generare più rappresentazioni. Grazie all'ABR (Adaptive Bitrate Streaming), il lettore Amazon IVS cambia automaticamente il rendering (bitrate) in base alle necessità in modo da ottimizzare la riproduzione per le condizioni di rete variabili.

Ogni rendering generato durante il live streaming viene registrato in un percorso univoco all'interno del prefisso di registrazione S3. I dettagli della risoluzione, il percorso e i nomi dei file delle playlist vengono memorizzati in un file di metadati JSON durante l'inizio e l'arresto della registrazione. Se il valore renditionSelection della configurazione di registrazione è ALL, tutti i rendering vengono selezionati per la registrazione. Se renditionSelection è CUSTOM, l'utente deve selezionare una o più delle seguenti opzioni: LOWEST_RESOLUTIONSDHD e FULL_HD. Di seguito sono elencate le risoluzioni per ciascuna opzione:

160 <= LOWEST_RESOLUTION <= 360

360 < SD <= 480

480 < HD <= 720

720 < FULL_HD <= 1.080

Importante: non fare alcuna ipotesi sul percorso del rendering statico o sull'elenco di rendering generati, poiché questi sono soggetti a modifiche. Non assumere che un rendering specifico sarà sempre disponibile per una registrazione Amazon IVS. Per determinare i rendering, le risoluzioni e i percorsi disponibili, fare riferimento ai file di metadati.

Il file event/recording_started.json o event/recording_ended.json all'interno del prefisso di registrazione contiene i percorsi e i nomi dei file multimediali nel prefisso di registrazione. Tutti gli elementi path sono relativi al percorso precedente nella gerarchia. Gli elementi in media > hls descrivono le risorse HLS, con il nome della playlist principale e il percorso definiti a questo livello.

Di seguito è riportato un frammento di codice Python che mostra come generare un percorso per la playlist principale utilizzando il prefisso di registrazione S3 e il file di metadati:

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

Gli elementi in media > hls > renditions descrivono l'elenco di rendering registrati. Le proprietà resolution_height e resolution_width possono essere utilizzate per identificare la risoluzione video. Gli elementi path e playlist possono essere utilizzati per derivare il percorso della playlist di rendering. Usare questi campi per determinare quale rendering utilizzare per qualsiasi post-elaborazione.

Per scoprire la playlist con la massima resa disponibile per una registrazione, puoi iscriverti agli eventi «IVS Recording State Change». EventBridge Consultare Usare Amazon EventBridge con IVS. Di seguito è riportato uno script Python di esempio che illustra l'utilizzo di una funzione lambda registrata a tali eventi.

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 }

Riproduzione di contenuti registrati da bucket privati

Gli oggetti registrati con la funzione di registrazione automatica su Amazon S3 sono privati per impostazione predefinita; pertanto, questi oggetti sono inaccessibili per la riproduzione utilizzando direttamente l'URL S3. Aprendo il manifesto principale HLS (file m3u8) per la riproduzione utilizzando il lettore Amazon IVS o un altro lettore, si riceverà un errore (ad esempio, "Non disponi dell'autorizzazione per accedere alla risorsa richiesta"). Puoi invece riprodurre questi file con Amazon CloudFront CDN (Content Delivery Network).

CloudFront Distribuzione Amazon

CloudFront Le distribuzioni possono essere configurate per fornire contenuti provenienti da bucket privati. In genere è preferibile disporre di bucket apertamente accessibili in cui le letture aggirano i controlli offerti da. CloudFront La distribuzione può essere configurata per il servizio da un bucket privato creando un Origin Access Control (OAC), ovvero un CloudFront utente speciale con autorizzazioni di lettura sul bucket di origine privato. Puoi creare l'OAC dopo aver creato la tua distribuzione, tramite la console o l'API. CloudFront Consulta Creazione di un nuovo controllo degli accessi all'origine.

Riproduzione da Amazon CloudFront

Dopo aver configurato la distribuzione utilizzando un OAC per accedere al tuo bucket privato, i tuoi file video dovrebbero essere disponibili per l'utilizzo tramite l'URL. CloudFront CloudFront L'URL è il nome del dominio di distribuzione nella scheda Dettagli della CloudFront console AWS. Dovrebbe essere simile a quanto segue:

a1b23cdef4ghij.cloudfront.net.

Per riprodurre in streaming il video registrato attraverso la distribuzione, trovare la chiave oggetto per il file master.m3u8. Dovrebbe essere simile a quanto segue:

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

Aggiungi la chiave dell'oggetto alla fine dell' CloudFront URL. Il proprio URL finale sarà simile a quanto segue:

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

Per la riproduzione da un browser Web, assicurati di configurare CORS sia nel bucket S3 che nel bucket CloudFront S3. Per la CloudFront configurazione, seguite le istruzioni in Creazione delle politiche di richiesta di origine per allegare una politica di richiesta CORS-S3 Origin e una politica di intestazione di risposta SimpleCORS alla distribuzione. CloudFront Consulta la pagina della console di configurazione di esempio qui sotto:

Esempio di pagina della console di configurazione. Si consiglia di utilizzare una policy di cache e una policy di richiesta di origine per controllare la chiave di cache e le richieste di origine.

Per la configurazione S3 CORS, consulta Configurazione CORS per creare regole appropriate per il bucket S3.

Ora è possibile riprodurre il video registrato come se venisse riprodotto direttamente da un bucket.

Per ulteriori informazioni, consulta Limitazione dell'accesso a un'origine Amazon S3.