Questa pagina descrive come creare clip di video on demand (VOD) da un live streaming utilizzando l'API Live Stream. I clip VOD sono costituiti da file manifest HLS e file di segmenti salvati da un live streaming. Sono supportati solo i manifest HLS.
Differenze tra clip VOD e sessioni DVR
I clip VOD (noti anche come clip del canale) sono simili alle sessioni DVR con le seguenti differenze principali:
- Sessioni DVR:
- L'API salva il manifest DVR nella stessa posizione dei segmenti dello stream live, quindi non è necessaria alcuna copia aggiuntiva in Cloud Storage. Il manifest DVR è simile al manifest del live streaming, ma più lungo. Al termine del periodo di conservazione, il file manifest viene eliminato insieme ai file dei segmenti.
- Puoi creare una sessione DVR per contenuti passati, attuali e futuri. Ad esempio, una sessione DVR può seguire un live streaming oppure puoi pianificare l'avvio e l'interruzione di una sessione DVR in un momento successivo.
- Un caso d'uso tipico per le sessioni DVR è supportare le funzionalità DVR per gli eventi in streaming dal vivo. Ad esempio, uno spettatore può partecipare al live streaming un'ora dopo l'inizio e visualizzare i contenuti con un ritardo di un'ora (o saltarne alcune parti).
- Clip del canale:
- L'API Live Stream copia il manifest del clip e i file di segmento associati in una directory specificata dall'utente in modo che non vengano eliminati al termine del periodo di conservazione. Hai il controllo completo del clip.
- È possibile creare clip solo dei contenuti passati. I clip dal vivo e la programmazione di clip futuri non sono supportati.
- Un tipico caso d'uso dei clip è l'archiviazione di un live streaming, rendendolo disponibile come file VOD a tempo indeterminato.
Per ulteriori informazioni sulle sessioni DVR, vedi Creare una sessione DVR.
Configura il progetto Google Cloud e l'autenticazione
Se non hai creato un progetto Google Cloud e le credenziali, consulta Prima di iniziare.Crea un endpoint di input
Per creare un endpoint di input, utilizza il metodo
projects.locations.inputs.create
.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER
: il numero del tuo progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAMLOCATION
: la posizione in cui creare l'endpoint di input. Utilizza una delle regioni supportateMostra sedius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: un identificatore definito dall'utente per il nuovo endpoint di input da creare (a cui invii lo stream di input). Questo valore deve contenere da 1 a 63 caratteri, deve iniziare e terminare con[a-z0-9]
e può contenere trattini (-) tra i caratteri. Ad esempio:my-input
.
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Questo comando crea un'operazione a lunga esecuzione (LRO) che puoi utilizzare per monitorare l'avanzamento della richiesta. Per ulteriori informazioni, consulta Gestire le operazioni che richiedono molto tempo .
Ottenere i dettagli dell'endpoint di input
Per ottenere i dettagli dell'endpoint di input, utilizza il metodo
projects.locations.inputs.get
.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER
: il numero del tuo progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAMLOCATION
: la località in cui si trova l'endpoint di input. Utilizza una delle regioni supportateMostra sedius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: l'identificatore definito dall'utente per l'endpoint di input
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID", "createTime": CREATE_TIME, "updateTime": UPDATE_TIME, "type": "RTMP_PUSH", "uri": "INPUT_STREAM_URI", # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b", "tier": "HD" }
Individua il campo uri
e copia il valore INPUT_STREAM_URI restituito da utilizzare in un secondo momento nella sezione Inviare lo stream di input.
Crea un canale
Per creare un canale, utilizza il metodo
projects.locations.channels.create
. Gli esempi riportati di seguito creano un canale che genera un live streaming HLS. Il live streaming è costituito da un'unica rappresentazione in alta definizione (1280 x 720).
Per attivare la creazione di clip dei VOD, aggiungi l'oggetto
retentionConfig
alla configurazione del canale.
"retentionConfig": {
"retentionWindowDuration": {
"seconds": 86400
}
},
Quando la conservazione è attivata per un canale di live streaming, i segmenti
e il manifest del live streaming vengono conservati per creare clip VOD. L'oggetto
retentionWindowDuration
specifica il
periodo di tempo per cui l'output del live streaming viene salvato dopo essere stato caricato su
Cloud Storage. La finestra di conservazione inizia al momento della creazione del segmento in Cloud Storage.
La finestra di conservazione è limitata a 30 giorni. Una volta trascorso il periodo di conservazione, i file dei segmenti del live streaming e il file manifest vengono eliminati automaticamente da Cloud Storage. Il manifest del clip VOD e i relativi file di segmento associati non vengono eliminati automaticamente. Non puoi creare clip di VOD utilizzando segmenti eliminati. Il processo di eliminazione è asincrono e può richiedere fino a 24 ore.
Specifica una chiave per il manifest per attivare la creazione di clip VOD. Fai riferimento a questa chiave quando crei il clip. Sono supportati solo i manifest HLS.
"manifests": [
{
...
"key": "manifest_hls"
}
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER
: il numero del tuo progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAMLOCATION
: la località in cui creare il canale. Utilizza una delle regioni supportateMostra sedius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: un identificatore definito dall'utente per il canale da creare. Questo valore deve contenere da 1 a 63 caratteri, deve iniziare e terminare con[a-z0-9]
e può contenere trattini (-) tra i caratteriINPUT_ID
: l'identificatore definito dall'utente per l'endpoint di inputBUCKET_NAME
: il nome del bucket Cloud Storage che hai creato per contenere i file manifest e segment del live streaming
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Questo comando crea un'operazione a lunga esecuzione (LRO) che puoi utilizzare per monitorare l'avanzamento della richiesta. Per ulteriori informazioni, consulta Gestire le operazioni che richiedono molto tempo .
Avvia il canale
Per avviare un canale, utilizza il metodo projects.locations.channels.start
.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER
: il numero del tuo progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAMLOCATION
: la località in cui si trova il tuo canale. Utilizza una delle regioni supportateMostra sedius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: un identificatore del canale definito dall'utente
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID", "verb": "start", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Questo comando crea un'operazione a lunga esecuzione (LRO) che puoi utilizzare per monitorare l'avanzamento della richiesta. Per ulteriori informazioni, consulta Gestire le operazioni che richiedono molto tempo .
Invia il flusso di input
Apri una nuova finestra del terminale. Esegui il seguente comando utilizzandoINPUT_STREAM_URI della sezioneOttieni i dettagli dell'endpoint di input:
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
-acodec aac -vcodec h264 -f flv INPUT_STREAM_URI
Creare un clip di una VOD
Per creare un clip di una VOD, utilizza il metodo
projects.locations.channels.clips.create
.
Utilizza il campo outputUri
per specificare la posizione in cui salvare i clip e il file manifest dei clip in Cloud Storage. Puoi utilizzare lo stesso
bucket che hai creato per il manifest del live streaming o un altro. Puoi anche aggiungere un nome di directory al nome del bucket (ad esempio my-bucket/vod-clip
).
Utilizza il campo manifestKey
nell'array
clipManifests
per specificare il manifest da cui salvare i clip. Nell'esempio di configurazione del canale in questa pagina, questa chiave è impostata su manifest_hls
.
Puoi combinare più sezioni di tempo del live streaming in un unico clip
aggiungendo oggetti timeSlice
all'array slices
.
"outputUri": "gs://my-bucket",
"clipManifests":[
{
"manifestKey": "manifest_hls"
}
],
"slices":[
{
"timeSlice": {
"markinTime": "2022-07-08T23:03:20.000Z",
"markoutTime": "2022-07-08T23:04:20.000Z"
}
},
{
"timeSlice": {
"markinTime": "2022-07-08T23:05:20.000Z",
"markoutTime": "2022-07-08T23:06:20.000Z"
}
}
]
Tieni presente quanto segue:
- Ogni clip deve contenere almeno un
timeSlice
inslices
. - Il campo
clipManifests.manifestKey
deve fare riferimento a un manifest HLS definito nel canale principale del clip. Se la richiesta di creazione del job di clip ha esito positivo, l'URI del manifest del clip generato viene restituito nel campoclipManifests.outputUri
. Questo URI si trova nel percorso specificato dal campooutputUri
del clip. - L'array
clipManifests
supporta un solo manifest per richiesta. Se vuoi generare più manifest per lo stesso job clip, devi suddividere i manifest in più richieste di job clip. - I clip devono essere omogenei; ogni elemento deve essere di tipo
timeSlice
. - L'insieme di oggetti
timeSlice
non deve sovrapporsi e deve essere in ordine cronologico.markinTime
deve essere precedente amarkoutTime
in ognitimeSlice
. - Se l'ultimo
markinTime
di un clip è precedente all'ora di inizio del canale o all'inizio del periodo di conservazione, l'ora di inserimento viene impostata sulla più recente delle due. - Se l'ultimo
markoutTime
di un clip è successivo all'ora di interruzione del canale, viene impostato sull'ora di interruzione del canale. Se l'ultimomarkoutTime
di un clip è successivo all'ora corrente del sistema, viene impostato sull'ora in cui l'API avvia effettivamente l'attività di clipping. - La durata massima di un clip è di 24 ore.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER
: il numero del tuo progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAMLOCATION
: la località in cui si trova il tuo canale. Utilizza una delle regioni supportateMostra sedius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: un identificatore del canale definito dall'utenteCLIP_ID
: un identificatore definito dall'utente per il clip VODMARK_IN_TIME
: l'ora Unix del mark-in nel manifest dello stream live originale; utilizza un timestamp in formato "Zulu" UTC RFC3339 (ad es.2014-10-02T15:01:23Z
)MARK_OUT_TIME
: l'ora Unix del markup nel manifest del live streaming originale; utilizza un timestamp in formato "Zulu" UTC RFC3339 (ad es.2014-10-02T15:01:23Z
)BUCKET_NAME
: il nome del bucket Cloud Storage che hai creato per contenere i file manifest e segmenti del clip VOD. Puoi utilizzare lo stesso bucket creato per il manifest del live streaming o un altro bucket. Puoi anche aggiungere un nome di directory al nome del bucket (ad esempiomy-bucket/vod-clip
)
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata", "createTime": CREATE_TIME, "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Questo comando crea un'operazione a lunga esecuzione (LRO) che puoi utilizzare per monitorare l'avanzamento della richiesta. Per ulteriori informazioni, consulta Gestire le operazioni che richiedono molto tempo .
Recuperare il clip della VOD
Per ottenere un clip di una VOD, utilizza il metodo projects.locations.channels.clips.get
.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER
: il numero del tuo progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAMLOCATION
: la località in cui si trova il tuo canale. Utilizza una delle regioni supportateMostra sedius-central1
us-east1
us-east4
us-west1
us-west2
northamerica-northeast1
southamerica-east1
asia-east1
asia-east2
asia-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: un identificatore del canale definito dall'utenteCLIP_ID
: un identificatore definito dall'utente per il clip VOD
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/clips/CLIP_ID", "createTime": CREATE_TIME, "startTime": START_TIME, "updateTime": UPDATE_TIME, "state": "SUCCEEDED", "outputUri": "gs://BUCKET_NAME", "slices": [ { "timeSlice": { "markinTime": "MARK_IN_TIME", "markoutTime": "MARK_OUT_TIME" } } ], "features": {}, "clipManifests": [ { "manifestKey": "manifest_hls", "outputUri": "gs://BUCKET_NAME/main.m3u8" } ] }
Il manifest generato si trova nell'URI specificato nel
campo clipManifests.outputUri
. Il nome del file manifest è uguale al valore del campo manifests.fileName
del canale principale.
La risposta deve contenere quanto segue:
{
...
"state": "SUCCEEDED"
...
}
Con il metodo
projects.locations.channels.clips.get
sono disponibili solo i 1000 record dei job dei clip più recenti per canale. Tutti i record dei job di clip precedenti al limite vengono rimossi. Devi gestire i file clip generati specificati da outputUri
. L'API Live Stream non elimina questi file da Cloud Storage.
Verifica i contenuti del bucket
Apri il bucket Cloud Storage come specificato nel campo outputUri
del clip. Verifica che contenga i seguenti file e directory:
- Un file manifest di primo livello per il clip con lo stesso nome del
manifests.fileName
specificato nella configurazione del canale (ad esempio,main.m3u8
); puoi riprodurre questo file manifest utilizzando un media player online - Una directory per ogni
muxStreams.key
specificato nel canale (ad esempiomux_video_ts
)- Una playlist per il clip (ad es.
index-1.m3u8
) - Una directory denominata utilizzando il formato
YYYYMMDDTHHMMSSZ
(ad es.20220708T203309Z/
); questa directory contiene i segmenti dei clip VOD- Più file
segment-number.ts
di segmenti che compongono il clip VOD
- Più file
- Una playlist per il clip (ad es.
Riproduci il clip del VOD
Per riprodurre il file multimediale generato in Shaka Player: compila i seguenti passaggi:
- Rendi pubblicamente leggibile il bucket Cloud Storage che hai creato.
- Per abilitare la condivisione delle risorse tra origini (CORS) su un bucket Cloud Storage, segui questi passaggi:
- Crea un file JSON contenente quanto segue:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
Esegui il seguente comando dopo aver sostituito
JSON_FILE_NAME
con il nome del file JSON creato nel passaggio precedente:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crea un file JSON contenente quanto segue:
- Nel bucket Cloud Storage, individua il file generato. Fai clic su Copia URL nella colonna Accesso pubblico del file.
- Vai a Shaka Player, un lettore per live streaming online.
- Fai clic su Custom Content (Contenuti personalizzati) nella barra di navigazione in alto.
- Fai clic sul pulsante +.
Incolla l'URL pubblico del file nella casella Manifest URL (URL del manifest).
Digita un nome nella casella Name (Nome).
Fai clic su Salva.
Fai clic su Play (Riproduci).
Dovresti vedere una sequenza di prova riprodotta come live streaming.
Eventi di interruzione pubblicitaria e slate
Se hai creato un evento di interruzione pubblicitaria per il live streaming, i clip VOD non conterranno gli annunci. L'API genera una playlist con le interruzioni pubblicitarie sostituite dai seguenti tag:
#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN
Le schede visualizzate all'inizio o alla fine del clip VOD vengono rimosse automaticamente. Le schede visualizzate all'interno dello stream, circondate dai contenuti del live streaming, vengono conservate nel clip VOD generato.