Questa pagina spiega come configurare i sottotitoli codificati nel formato Web Video Text Tracks (WebVTT) per un live streaming. I sottotitoli vengono generati dai sottotitoli codificati cea608 o cea708 nel flusso di input.
I sottotitoli codificati sono supportati per i live streaming HLS e DASH.
Prima di iniziare
Questa pagina presuppone che tu abbia completato i passaggi descritti nella sezione Prima di iniziare della guida rapida per il live streaming HLS o della guida rapida per il live streaming MPEG-DASH.
Crea l'endpoint di input
Per creare l'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 ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui creare l'endpoint di input; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-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 i caratteri. Ad esempio:my-input.
Corpo JSON della richiesta:
{
"type": "RTMP_PUSH"
}
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
}
Copia il valore OPERATION_ID restituito da utilizzare nella sezione successiva.
Controlla il risultato
Utilizza il metodo projects.locations.operations.get per verificare se
l'endpoint di input è stato creato. Se la risposta contiene "done: false",
ripeti il comando finché la risposta non contiene "done: true". La creazione del
primo endpoint di input in una regione può richiedere fino a 10 minuti.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER: il numero del tuo progetto Google Cloud ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui si trova l'endpoint di input; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
OPERATION_ID: l'identificatore dell'operazione
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,
"endTime": END_TIME,
"target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
"verb": "create",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input",
"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 valore INPUT_STREAM_URI restituito da utilizzare in un secondo momento nella sezione Invia il flusso di input.
Crea il canale
Per creare il canale, utilizza il
metodo projects.locations.channels.create.
Tieni presente quanto segue nella configurazione del canale:
Un
ElementaryStream, unTextStream, viene utilizzato per i sottotitoli.{ "key": "webvtt-english", "textStream": { "codec": "webvtt", "display_name": "English", "language_code": "en-US", "mapping": [ { "input_cea_channel": "CC1" } ] } }Il campo
TextStreamcodecè impostato suwebvtt.Il campo
TextStreammappingmappa i flussi di input alle tracce di testo. In questo esempio,input_cea_channelè mappato al canale di inputCC1per i sottotitoli codificati in inglese.Lo stream elementare viene utilizzato per creare un
MuxStreamcon chiavevtt-english.{ "key": "vtt_english", "container": "vtt", "elementaryStreams": [ "webvtt-english" ], "segmentSettings": { "segmentDuration": "2s" } }Questo stream mux viene quindi fatto riferimento sia nei file manifest HLS che DASH.
{ "fileName": "main.m3u8", "type": "HLS", "muxStreams": [ "mux_video_ts", "vtt_english" ], "maxSegmentCount": 5 }
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER: il numero del tuo progetto Google Cloud ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui creare il canale; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: un identificatore definito dall'utente per il canale da creare; questo valore deve contenere da 1 a 63 caratteri, 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 segmento del live streaming
Corpo JSON della richiesta:
{
"inputAttachments": [
{
"key": "my-input",
"input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID"
}
],
"output": {
"uri": "gs://BUCKET_NAME"
},
"elementaryStreams": [
{
"key": "es_video",
"videoStream": {
"h264": {
"profile": "high",
"widthPixels": 1280,
"heightPixels": 720,
"bitrateBps": 3000000,
"frameRate": 30
}
}
},
{
"key": "es_audio",
"audioStream": {
"codec": "aac",
"channelCount": 2,
"bitrateBps": 160000
}
},
{
"key": "webvtt-english",
"textStream": {
"codec": "webvtt",
"display_name": "English",
"language_code": "en-US",
"mapping": [
{
"input_cea_channel": "CC1"
}
]
}
}
],
"muxStreams": [
{
"key": "mux_video_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_video"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_audio_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": [
"es_video",
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "vtt_english",
"container": "vtt",
"elementaryStreams": [
"webvtt-english"
],
"segmentSettings": {
"segmentDuration": "2s"
}
}
],
"manifests": [
{
"key": "manifest_dash",
"fileName": "main.mpd",
"type": "DASH",
"muxStreams": [
"mux_video_fmp4",
"mux_audio_fmp4",
"vtt_english"
],
"maxSegmentCount": 5
},
{
"key": "manifest_hls",
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts",
"vtt_english"
],
"maxSegmentCount": 5
}
]
}
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
}
Recuperare il canale
Puoi controllare il risultato dell'operazione di creazione del canale utilizzando il nuovo ID operazione.
Dopo aver creato il canale, utilizza il
metodo projects.locations.channels.get per eseguire query sullo stato
del canale.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER: il numero del tuo progetto Google Cloud ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui si trova il tuo canale; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: un identificatore definito dall'utente per il canale
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",
"createTime": CREATE_TIME,
"updateTime": UPDATE_TIME,
"inputAttachments": [
{
"key": "INPUT_ID",
"input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID"
}
],
"activeInput": "INPUT_ID",
"output": {
"uri": "gs://BUCKET_NAME"
},
"elementaryStreams": [
{
"key": "es_video",
"videoStream": {
"h264": {
"profile": "high",
"widthPixels": 1280,
"heightPixels": 720,
"bitrateBps": 3000000,
"frameRate": 30
}
}
},
{
"key": "es_audio",
"audioStream": {
"codec": "aac",
"channelCount": 2,
"bitrateBps": 160000
}
},
{
"key": "webvtt-english",
"textStream": {
"codec": "webvtt",
"display_name": "English",
"language_code": "en-US",
"mapping": [
{
"input_cea_channel": "CC1"
}
]
}
}
],
"muxStreams": [
{
"key": "mux_video_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_video"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_audio_fmp4",
"container": "fmp4",
"elementaryStreams": [
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "mux_video_ts",
"container": "ts",
"elementaryStreams": [
"es_video",
"es_audio"
],
"segmentSettings": {
"segmentDuration": "2s"
}
},
{
"key": "vtt_english",
"container": "vtt",
"elementaryStreams": [
"webvtt-english"
],
"segmentSettings": {
"segmentDuration": "2s"
}
}
],
"manifests": [
{
"key": "manifest_dash",
"fileName": "main.mpd",
"type": "DASH",
"muxStreams": [
"mux_video_fmp4",
"mux_audio_fmp4",
"vtt_english"
],
"maxSegmentCount": 5
},
{
"key": "manifest_hls",
"fileName": "main.m3u8",
"type": "HLS",
"muxStreams": [
"mux_video_ts",
"vtt_english"
],
"maxSegmentCount": 5
}
],
"streamingState": "STOPPED"
}
La risposta completa contiene il seguente campo:
{
...
"streamingState": "STOPPED"
...
}
Questa risposta indica che ora puoi avviare il canale.
Avviare il canale
Utilizza il metodo projects.locations.channels.start per avviare il
canale. Un canale deve essere avviato prima di poter accettare flussi di input o
generare un flusso di output.
L'avvio del primo canale in una regione richiede circa 10 minuti.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER: il numero del tuo progetto Google Cloud ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui si trova il tuo canale; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: un identificatore definito dall'utente per il canale
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
}
Per determinare se il canale è stato avviato, recupera le informazioni come fatto in precedenza. La risposta deve contenere quanto segue:
{
...
"streamingState": "AWAITING_INPUT"
...
}
Inviare il flusso di input
Ora che il canale è pronto, invia un flusso di input all'endpoint di input per generare il live streaming. Puoi scaricare un file MP4 (o un altro
TEST_VOD_FILE) con i sottotitoli codificati e
utilizzare ffmpeg per inviarlo all'endpoint di input.
Apri una nuova finestra del terminale. Esegui questo comando utilizzando INPUT_STREAM_URI della sezione Controlla il risultato:
ffmpeg -re -stream_loop -1 -i "TEST_VOD_FILE" \
-c:v copy -c:a aac -strict 2 -f "flv" "INPUT_STREAM_URI"
Riproduci il live streaming generato
Per riprodurre il file multimediale generato in Shaka Player, completa i seguenti passaggi:
- Rendi leggibile pubblicamente il bucket Cloud Storage che hai creato.
- Per abilitare la condivisione delle risorse tra origini (CORS) in un bucket Cloud Storage, segui questi passaggi:
- Crea un file JSON contenente le seguenti informazioni:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ] -
Esegui il comando seguente dopo aver sostituito
JSON_FILE_NAMEcon il nome del file JSON che hai creato nel passaggio precedente:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crea un file JSON contenente le seguenti informazioni:
- Nel bucket Cloud Storage, individua il file
main.m3u8generato. 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 la riproduzione del live streaming. Potresti dover abilitare i sottotitoli nell'interfaccia utente di Shaka Player.
Esegui la pulizia
Interrompere il canale
Utilizza il metodo
projects.locations.channels.stop per interrompere il canale.
Devi interrompere il canale prima di poterlo eliminare.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER: il numero del tuo progetto Google Cloud ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui si trova il tuo canale; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: un identificatore definito dall'utente per il canale
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": "stop",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
Interrompere lo stream di input
Se hai utilizzato ffmpeg per inviare il flusso di input, la connessione viene interrotta automaticamente
dopo l'interruzione del canale.
Eliminare il canale
Utilizza il
metodo projects.locations.channels.delete per eliminare il
canale. Devi eliminare il canale prima di poter eliminare l'endpoint di input
utilizzato dal canale.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER: il numero del tuo progetto Google Cloud ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui si trova il tuo canale; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: un identificatore definito dall'utente per il canale
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": "delete",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
Elimina l'endpoint di input
Utilizza il
metodo projects.locations.inputs.delete per eliminare l'endpoint
di input.
Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:
PROJECT_NUMBER: il numero del tuo progetto Google Cloud ; si trova nel campo Numero progetto nella pagina Impostazioni IAMLOCATION: la località in cui si trova l'endpoint di input; utilizza una delle regioni supportateMostra localitàus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-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/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": "delete",
"requestedCancellation": false,
"apiVersion": "v1"
},
"done": false
}
Elimina il bucket Cloud Storage
Nella console Google Cloud , vai alla pagina Browser Cloud Storage.
Seleziona la casella di controllo accanto al bucket che hai creato.
Fai clic su Elimina.
Nella finestra di dialogo visualizzata, fai clic su Elimina per eliminare definitivamente il bucket e i relativi contenuti.