En esta página, se describe cómo crear clips de video on demand (VOD) a partir de una transmisión en vivo con la API de Live Stream. Los clips de VOD se componen de archivos de manifiesto de HLS. y los archivos de segmentos que se guardaron de una transmisión en vivo. Solo se admiten manifiestos HLS.
Configura el proyecto de Google Cloud y la autenticación
Si no creaste un Proyecto de Google Cloud y credenciales, consulta Antes de comenzar.Crea un extremo de entrada
Para crear un extremo de entrada, usa el
projects.locations.inputs.create
.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
PROJECT_NUMBER
: Es el número de tu proyecto de Google Cloud, que se encuentra en el campo Número de proyecto de la página Configuración de IAM.LOCATION
: Es la ubicación en la que se creará el extremo de entrada. Usa una de las regiones compatibles.Mostrar ubicacionesus-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
: Es un identificador definido por el usuario para el nuevo extremo de entrada que se creará (al que envías tu flujo de entrada). Este valor debe tener entre 1 y 63 caracteres, comenzar y terminar con[a-z0-9]
, y puede contener guiones (-) entre los caracteres. Por ejemplo,my-input
.
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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 }
Este comando crea una operación de larga duración (LRO) que puedes usar para realizar un seguimiento del progreso de tu solicitud. Consulta Administra operaciones de larga duración para obtener más información.
Obtén detalles del extremo de entrada
Para obtener los detalles del extremo de entrada, usa el
projects.locations.inputs.get
.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
PROJECT_NUMBER
: Es el número de tu proyecto de Google Cloud, que se encuentra en el campo Número de proyecto de la página Configuración de IAM.LOCATION
: Es la ubicación en la que se encuentra el extremo de entrada. Usa una de las regiones compatibles.Cómo mostrar ubicacionesus-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
: Es el identificador definido por el usuario para el extremo de entrada.
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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" }
Busca el campo uri
y copia los datos que se muestran.
INPUT_STREAM_URI para usar más tarde
en la sección Send the input stream.
Crea un canal
Para crear un canal, usa el
projects.locations.channels.create
. En los siguientes ejemplos, se crea un canal que genera una transmisión en vivo de HLS. La transmisión en vivo consta de una sola renderización de alta definición (1280 x 720).
Para habilitar la creación de clips de VOD, agrega el siguiente elemento:
retentionConfig
a la configuración del canal.
"retentionConfig": {
"retentionWindowDuration": {
"seconds": 86400
}
},
Cuando se habilita la retención para un canal de transmisión en vivo, se conservan los archivos de manifiesto y segmento para crear clips de VOD. El objeto retentionWindowDuration
especifica el tiempo durante el cual se guarda el resultado de la transmisión en vivo después de subirlo a Cloud Storage. El período de retención comienza en el momento en que se crea el segmento en Cloud Storage. El período de retención es limitado a 30 días.
Una vez transcurrido el período de retención, el segmento se borra automáticamente de
en Google Cloud Storage. No puedes crear clips de VOD con segmentos borrados. El proceso de eliminación es asíncrono y puede tardar hasta 24 horas en completarse.
Especifica una clave para el manifiesto para habilitar la creación de clips de VOD. Se refiere a esto cuando crees el clip. Solo se admiten manifiestos HLS.
"manifests": [
{
...
"key": "manifest_hls"
}
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
PROJECT_NUMBER
: Es el número de tu proyecto de Google Cloud, que se encuentra en el campo Número de proyecto de la página Configuración de IAM.LOCATION
: Es la ubicación en la que se creará el canal. Usa una de las regiones compatibles.Cómo mostrar ubicacionesus-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
: Es un identificador definido por el usuario para que el canal crear; este valor debe tener entre 1 y 63 caracteres, comenzar y terminar con[a-z0-9]
, y puede contener guiones (-) entre los caracteresINPUT_ID
: Es el identificador definido por el usuario para el extremo de entrada.BUCKET_NAME
: Es el nombre de Cloud Storage. bucket que creaste para guardar el manifiesto de la transmisión en vivo y los archivos de segmentos
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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 }
Este comando crea una operación de larga duración (LRO) que puedes usar para hacer un seguimiento del progreso de tu solicitud. Consulta Administra operaciones de larga duración para obtener más información.
Empieza el canal
Para iniciar un canal, usa el método projects.locations.channels.start
.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
PROJECT_NUMBER
: Es tu proyecto de Google Cloud. número; se encuentra en el campo Número de proyecto de la Página Configuración de IAMLOCATION
: Es la ubicación en la que se encuentra tu canal. Usa una de las regiones admitidas.Mostrar ubicacionesus-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
: Es un identificador definido por el usuario para el canal.
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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 }
Este comando crea una operación de larga duración (LRO) que puedes usar para hacer un seguimiento del progreso de tu solicitud. Consulta Administra operaciones de larga duración para obtener más información.
Cómo enviar el flujo de entrada
Abre una nueva ventana de la terminal. Ejecuta el siguiente comando con INPUT_STREAM_URI desde Sección Obtén detalles del extremo de entrada:
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
-acodec aac -vcodec h264 -f flv INPUT_STREAM_URI
Cómo crear un clip de VOD
Para crear un clip de VOD, usa el método projects.locations.channels.clips.create
.
Usa el campo outputUri
para especificar la ubicación en la que se guardará
el archivo de manifiesto de clips y clips en Cloud Storage. Puedes usar el mismo bucket que creaste para el manifiesto de la transmisión en vivo o uno diferente. También puedes agregar un nombre de directorio al nombre del bucket (por ejemplo, my-bucket/vod-clip
).
Usa el campo manifestKey
en el array clipManifests
para especificar el manifiesto desde el que se guardarán los clips. En la configuración de canales de ejemplo en esta página, esta clave se establece en manifest_hls
.
Puedes combinar varias secciones de tiempo de la transmisión en vivo en un solo clip.
Para ello, agrega objetos timeSlice
al 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"
}
}
]
Ten en cuenta lo siguiente:
- Cada clip debe contener al menos un
timeSlice
enslices
- El campo
clipManifests.manifestKey
debe hacer referencia a un manifiesto HLS definido en el canal superior del clip. Si el nombre del clip la solicitud se realiza correctamente, el URI del manifiesto del clip generado se devuelve en el campoclipManifests.outputUri
Este URI se encuentra en la ruta de acceso especificada por el campooutputUri
del clip. - El array
clipManifests
solo admite un manifiesto por para cada solicitud. Si deseas generar varios manifiestos para el mismo trabajo de clip, debes dividirlos en varias solicitudes de trabajo de clip. - Las porciones de recorte deben ser homogéneas. cada elemento debe ser de tipo
timeSlice
- El conjunto de objetos
timeSlice
no debe superponerse y estar en orden cronológico. ElmarkinTime
debe ser anterior almarkoutTime
en cadatimeSlice
. - Si el
markinTime
más reciente de un clip es anterior a la hora de inicio del canal o al inicio de la ventana de retención, la hora de inserción se establece en la más reciente de las dos. - Si el último
markoutTime
de un clip es posterior al se establece en la hora de finalización del canal. Si elmarkoutTime
más reciente de un clip es posterior a la hora del reloj del sistema actual, se establece en la hora en que la API inicia la tarea de recorte. - La duración máxima de un clip es de 24 horas.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
PROJECT_NUMBER
: Es tu proyecto de Google Cloud. número; se encuentra en el campo Número de proyecto de la Página Configuración de IAMLOCATION
: Es la ubicación en la que se encuentra tu canal. Usa una de las regiones admitidas.Mostrar ubicacionesus-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
: Es un identificador definido por el usuario para el canal.CLIP_ID
: Es un identificador definido por el usuario para el clip de VOD.MARK_IN_TIME
: Es la marca de tiempo de época Unix en el manifiesto de transmisión en vivo original. Usa una marca de tiempo en formato RFC3339 UTC “Zulu” (por ejemplo,2014-10-02T15:01:23Z
).MARK_OUT_TIME
: Es la marca de tiempo de época Unix en el manifiesto de transmisión en vivo original. Usa una marca de tiempo en formato RFC3339 UTC “Zulu” (por ejemplo,2014-10-02T15:01:23Z
).BUCKET_NAME
: Es el nombre del bucket de Cloud Storage que creaste para contener el manifiesto de clips de VOD y los archivos de segmentos. Puedes usar el mismo bucket que creaste para el manifiesto de transmisión en vivo o uno diferente. También puedes agregar un nombre de directorio al nombre del bucket (por ejemplo,my-bucket/vod-clip
).
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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 }
Este comando crea una operación de larga duración (LRO) que puedes usar para realizar un seguimiento del progreso de tu solicitud. Consulta Administra operaciones de larga duración para obtener más información.
Obtener el clip de VOD
Para obtener un clip de VOD, usa el projects.locations.channels.clips.get
.
.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
PROJECT_NUMBER
: Es el número de tu proyecto de Google Cloud, que se encuentra en el campo Número de proyecto de la página Configuración de IAM.LOCATION
: Es la ubicación donde se encuentra tu canal. localizado; usa una de las regiones admitidasMostrar ubicacionesus-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
: Es un identificador definido por el usuario para el canal.CLIP_ID
: Es un identificador definido por el usuario para el clip de VOD.
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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" } ] }
El manifiesto generado se ubica en el URI especificado en el
clipManifests.outputUri
. El nombre del archivo del manifiesto es el mismo que el valor del campo manifests.fileName
del canal superior.
La respuesta debe contener lo siguiente:
{
...
"state": "SUCCEEDED"
...
}
Solo están disponibles los 1,000 registros de trabajos de clip por canal más recientes.
con el
projects.locations.channels.clips.get
. Se quitarán los registros de trabajos de clip que sean anteriores al límite. Debes administrar los archivos de clip generados que especifica outputUri
. La API de transmisión en vivo no borra estos archivos de Cloud Storage.
Verifica el contenido del bucket
Abre el bucket de Cloud Storage como se especifica en el archivo
outputUri
. Verifica que contenga los siguientes archivos y directorios:
- Un manifiesto de nivel superior para el clip con el mismo nombre que el
Se especificó
manifests.fileName
en el canal configuración (por ejemplo,main.m3u8
); puedes reproducir este manifiesto un reproductor de medios en línea - Un directorio para cada
muxStreams.key
especificado en el canal (por ejemplo,mux_video_ts
)- Es una playlist para el clip (por ejemplo,
index-1.m3u8
). - Un directorio con el nombre en el formato
YYYYMMDDTHHMMSSZ
(por ejemplo,20220708T203309Z/
). Este directorio contiene los segmentos de clips de VOD.- Varios archivos de segmentos
segment-number.ts
que componen el clip de VOD.
- Varios archivos de segmentos
- Es una playlist para el clip (por ejemplo,
Reproducir el clip de VOD
Para reproducir el archivo multimedia generado en Shaka Player, sigue estos pasos:
- Configura el bucket de Cloud Storage para que sea legible de forma pública.
- Para habilitar el uso compartido de recursos multiorigen (CORS) en un depósito de Cloud Storage, haz lo siguiente:
- Crea un archivo JSON que contenga la siguiente información:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
Ejecuta el siguiente comando después de reemplazar
JSON_FILE_NAME
por el nombre del archivo JSON que creaste en el paso anterior:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crea un archivo JSON que contenga la siguiente información:
- En el bucket de Cloud Storage, busca el archivo . Haz clic en Copiar URL en la columna Acceso público del archivo.
- Navega a Shaka Player, un reproductor en línea de transmisión en vivo.
- Haz clic en Contenido personalizado en la barra de navegación superior.
- Haz clic en el botón +.
Pega la URL pública del archivo en la casilla URL del manifiesto.
Escribe un nombre en el cuadro Nombre.
Haz clic en Guardar.
Haz clic en Reproducir.
Deberías ver que un patrón de prueba se reproduce como la transmisión en vivo.
Eventos de pausa publicitaria y cortinilla
Si un evento de pausa publicitaria para la transmisión en vivo, los clips de VOD no contendrá los anuncios. La API genera una playlist con los puntos de pausa de anuncios reemplazados por las siguientes etiquetas:
#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN
Las cortinillas que aparecen al principio o al final del clip de VOD se quitan automáticamente. Las cortinillas que aparecen en la transmisión, rodeadas por el contenido de la transmisión en vivo, se conservan en el clip de VOD generado.