Creare clip VOD a partire da un live streaming

In questa pagina viene descritto come creare clip video on demand (VOD) da un live streaming utilizzando l'API Live Stream. I clip VOD sono costituiti da file manifest HLS e file dei segmenti salvati da un live streaming. Sono supportati solo i manifest HLS.

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, effettua le seguenti sostituzioni:

  • PROJECT_NUMBER: il numero del progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAM
  • LOCATION: la località in cui creare l'endpoint di input; usa una delle regioni supportate
    Mostra località
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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 il flusso di input). Questo valore deve contenere da 1 a 63 caratteri, iniziare e terminare con [a-z0-9] e può contenere trattini (-) tra un carattere e l'altro. Ad esempio: my-input.

Per inviare la richiesta, espandi una delle seguenti 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, vedi Gestire le operazioni a lunga esecuzione .

Ottieni dettagli 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, effettua le seguenti sostituzioni:

  • PROJECT_NUMBER: il numero del progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAM
  • LOCATION: la località in cui si trova l'endpoint di input; utilizza una delle regioni supportate
    Mostra località
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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 delle seguenti 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"
}

Trova il campo uri e copia il INPUT_STREAM_URI restituito per utilizzarlo in un secondo momento nella sezione Invia lo stream di input.

Crei un canale

Per creare un canale, utilizza il metodo projects.locations.channels.create. I seguenti esempi creano un canale che genera un live streaming HLS. Il live streaming consiste in un'unica visualizzazione in alta definizione (1280 x 720).

Per attivare la creazione di clip VOD, aggiungi l'oggetto retentionConfig alla configurazione del canale.

"retentionConfig": {
  "retentionWindowDuration": {
      "seconds": 86400
    }
},

Quando la conservazione è abilitata per un canale con live streaming, i file del segmento e del file manifest vengono conservati per creare clip VOD. L'oggetto retentionWindowDuration specifica per quanto tempo l'output del live streaming viene salvato dopo essere stato caricato in Cloud Storage. Il periodo di conservazione inizia nel momento in cui il segmento viene creato in Cloud Storage. Il periodo di conservazione è limitato a 30 giorni. Una volta trascorso il periodo di conservazione, il segmento viene eliminato automaticamente da Cloud Storage. Non puoi creare clip VOD utilizzando i segmenti eliminati. Il processo di eliminazione è asincrono e può richiedere fino a 24 ore.

Specifica una chiave per il file manifest per consentire la creazione di clip VOD. Fai riferimento a questa chiave quando crei effettivamente il clip. Sono supportati solo i manifest HLS.

"manifests": [
{
  ...
  "key": "manifest_hls"
}

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • PROJECT_NUMBER: il numero del progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAM
  • LOCATION: la località in cui creare il canale; utilizza una delle regioni supportate
    Mostra località
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: un identificatore definito dall'utente per il canale da creare; questo valore deve essere compreso tra 1 e 63 caratteri, iniziare e terminare con [a-z0-9] e può contenere trattini (-) tra un carattere e un altro
  • INPUT_ID: l'identificatore definito dall'utente per l'endpoint di input
  • BUCKET_NAME: il nome del bucket Cloud Storage creato per contenere il manifest del live streaming e i file dei segmenti

Per inviare la richiesta, espandi una delle seguenti 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, vedi Gestire le operazioni a lunga esecuzione .

Avvia il canale

Per avviare un canale, utilizza il metodo projects.locations.channels.start.

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • PROJECT_NUMBER: il numero del progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAM
  • LOCATION: la località in cui si trova il tuo canale; utilizza una delle regioni supportate
    Mostra località
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: un identificatore del canale definito dall'utente

Per inviare la richiesta, espandi una delle seguenti 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, vedi Gestire le operazioni a lunga esecuzione .

Invia il flusso di input

Apri una nuova finestra del terminale. Esegui questo comando, utilizzando INPUT_STREAM_URI nella sezione Recupera 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 VOD

Per creare un clip 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 bucket diverso. 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 temporali 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 elemento timeSlice in slices.
  • Il campo clipManifests.manifestKey deve fare riferimento a un file 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 campo clipManifests.outputUri. Questo URI si trova nel percorso specificato dal campo outputUri del clip.
  • L'array clipManifests supporta un solo manifest per richiesta. Per generare più manifest per lo stesso job di clip, devi suddividere i manifest in più richieste di job di clip.
  • Le sezioni dei clip devono essere omogenee; ogni elemento deve essere di tipo timeSlice.
  • L'insieme di oggetti timeSlice non deve essere sovrapposto e in ordine cronologico. Il markinTime deve essere precedente al markoutTime in ogni timeSlice.
  • Se l'ultimo elemento markinTime di un clip è precedente all'ora di inizio del canale o all'inizio del periodo di conservazione, il tempo di markup è impostato su un valore successivo ai due.
  • Se l'ultimo elemento markoutTime di un clip è successivo all'ora di fine del canale, allora viene impostato il punto di interruzione del canale. Se l'ultimo elemento markoutTime di un clip è successivo all'ora dell'orologio di base del sistema attuale, viene impostato sull'ora in cui l'API avvia effettivamente l'attività di ritaglio.
  • La durata massima di un clip è 24 ore.

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • PROJECT_NUMBER: il numero del progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAM
  • LOCATION: la località in cui si trova il tuo canale; utilizza una delle regioni supportate
    Mostra località
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: un identificatore del canale definito dall'utente
  • CLIP_ID: un identificatore definito dall'utente per il clip VOD.
  • MARK_IN_TIME: l'ora di inizio di un'epoca Unix nel manifest del live streaming originale; utilizza un timestamp nel formato "Zulu" RFC3339 UTC (ad esempio, 2014-10-02T15:01:23Z)
  • MARK_OUT_TIME: l'ora di Unix di mark-out nel file manifest del live streaming originale; utilizza un timestamp nel formato RFC3339 UTC "Zulu" (ad esempio, 2014-10-02T15:01:23Z)
  • BUCKET_NAME: il nome del bucket Cloud Storage creato per contenere il manifest dei clip VOD e i file dei segmenti; puoi utilizzare lo stesso bucket che hai creato per il manifest del live streaming o un bucket diverso; puoi anche aggiungere un nome di directory al nome del bucket (ad esempio my-bucket/vod-clip)

Per inviare la richiesta, espandi una delle seguenti 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, vedi Gestire le operazioni a lunga esecuzione .

Scarica il clip VOD

Per scaricare un clip VOD, utilizza il metodo projects.locations.channels.clips.get.

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • PROJECT_NUMBER: il numero del progetto Google Cloud, che si trova nel campo Numero progetto della pagina Impostazioni IAM
  • LOCATION: la località in cui si trova il tuo canale; utilizza una delle regioni supportate
    Mostra località
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: un identificatore del canale definito dall'utente
  • CLIP_ID: un identificatore definito dall'utente per il clip VOD.

Per inviare la richiesta, espandi una delle seguenti 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 file manifest è uguale al valore del campo manifests.fileName del canale principale.

La risposta deve contenere quanto segue:

{
  ...
  "state": "SUCCEEDED"
  ...
}

Sono disponibili solo i 1000 record di job di clip più recenti per canale utilizzando il metodo projects.locations.channels.clips.get. Tutti i record di job di clip antecedenti il limite vengono rimossi. Devi gestire i file di clip generati specificati dall'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 manifest di primo livello per il clip con lo stesso nome di manifests.fileName specificato nella configurazione del canale (ad esempio main.m3u8). Puoi riprodurlo utilizzando un media player online
  • Una directory per ogni muxStreams.key specificata nel canale (ad es. mux_video_ts).
    • Una playlist per il clip (ad esempio, index-1.m3u8)
    • Una directory denominata utilizzando il formato YYYYMMDDTHHMMSSZ (ad esempio, 20220708T203309Z/); questa directory contiene i segmenti di clip VOD
      • Più file segment-number.ts di segmenti che compongono il clip VOD

Riproduci il clip VOD

Per riprodurre il file multimediale generato in Shaka Player, completa i seguenti passaggi:

  1. Rendi leggibile pubblicamente il bucket Cloud Storage che hai creato.
  2. Per abilitare la condivisione delle risorse tra origini (CORS) in un bucket Cloud Storage, segui questi passaggi:
    1. Crea un file JSON contenente quanto segue:
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. Esegui questo comando dopo aver sostituito JSON_FILE_NAME con il nome del file JSON che hai creato nel passaggio precedente:
      gsutil cors set JSON_FILE_NAME.json gs://BUCKET_NAME
  3. Nel bucket Cloud Storage, individua il file generato. Fai clic su Copia URL nella colonna Accesso pubblico del file.
  4. Vai a Shaka Player, un player online per il live streaming.
  5. Fai clic su Custom Content (Contenuti personalizzati) nella barra di navigazione in alto.
  6. Fai clic sul pulsante +.
  7. Incolla l'URL pubblico del file nella casella Manifest URL (URL del manifest).

  8. Digita un nome nella casella Name (Nome).

  9. Fai clic su Salva.

  10. Fai clic su Play (Riproduci).

Dovresti vedere una sequenza di prova riprodotta come live streaming.

Video sul pattern di test

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 i punti di interruzione pubblicitaria sostituiti dai seguenti tag:

#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN

Gli slate che appaiono all'inizio o alla fine del clip VOD vengono rimossi automaticamente. Gli slate visualizzati nello stream, circondati dai contenuti del live streaming, vengono conservati nel clip VOD generato.