Registrazione automatica di IVS su Amazon S3 | Streaming a bassa latenza - Amazon IVS

Registrazione automatica di IVS su Amazon S3 | Streaming a bassa latenza

In questa sezione vengono fornite informazioni sulla funzione Registrazione automatica su S3 disponibile nello 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 la registrazione abilitata, il prefisso S3 viene generato all'avvio di una sessione live e verrà fornito nell'evento CloudWatch all'inizio e alla fine di 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.

Tenere presente che dopo l'avvio di un live streaming e l'emissione dell'evento EventBridge di avvio registrazione, prima che vengano scritti i file manifest e i segmenti video è possibile che passi del tempo. Consigliamo di riprodurre o elaborare flussi registrati solo dopo l'invio dell'evento di fine registrazione. Consultare Utilizzo di 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 di registrazione automatica su S3 supporta la generazione di playlist con intervalli 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 ulteriori informazioni, consulta la Documentazione di riferimento delle API di Streaming a bassa latenza 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

Se resolution non è impostato per un flusso che utilizza un input video multitraccia, vengono registrate le anteprime di tutti i rendering. Per informazioni sul multitraccia, consulta la sezione Video multitraccia.

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 della registrazione e i file di metadati JSON di registrazione terminata sono ritardati di almeno recordingReconnectWindowSeconds, mentre Amazon IVS attende per assicurarsi che non venga avviato un nuovo flusso.

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 generato un parametro Amazon CloudWatch corrispondente e un file di metadati viene scritto 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_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 } } }

Individuazione dei rendering di una registrazione

Quando si esegue lo streaming di contenuti su un canale Amazon IVS, la registrazione automatica su S3 utilizza il video sorgente per generare più rendering. 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 di rendering più alta disponibile per una registrazione, è possibile registrarsi agli eventi EventBridge "Modifica dello stato di registrazione IVS". Consultare Utilizzo di 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"). Pertanto, è possibile riprodurre questi file con Amazon CloudFront CDN (Content Delivery Network).

Distribuzione tramite Amazon CloudFront

Le distribuzioni CloudFront possono essere configurate in modo da distribuire i contenuti da bucket privati. Generalmente, è preferibile disporre di bucket accessibili in modo aperto in cui le letture ignorano i controlli offerti da CloudFront. La tua distribuzione può essere configurata in modo da funzionare da un bucket privato creando un controllo degli accessi all'origine (OAC), ovvero un utente CloudFront speciale che dispone delle autorizzazioni di lettura sul bucket di origine privato. Puoi creare l'OAC dopo aver creato la distribuzione tramite la console CloudFront o l'API. 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 bucket privato, i file video dovrebbero essere disponibili per l'utilizzo tramite l'URL di CloudFront. L'URL di CloudFront è Nome del dominio della distribuzione nella scheda Dettagli della console AWS CloudFront. 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

Aggiungere la chiave oggetto alla fine dell'URL di CloudFront. 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 riprodurre da un browser Web, assicurati di configurare CORS sia in CloudFront che nel bucket S3. Per la configurazione di CloudFront, segui le istruzioni riportate in Creazione di policy di richiesta origine per allegare una policy di richiesta origine CORS-S3 e una policy di intestazione della 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.