En esta página se muestra cómo crear una sesión de grabadora de vídeo digital (DVR) a partir de una emisión en directo con la API Live Stream. Puedes ver una sesión de grabación durante una emisión en directo y después de que termine.
Diferencias entre las sesiones de DVR y los clips de canales
Las sesiones de DVR son similares a los clips de canales (también conocidos como "clips de VOD"), pero con las siguientes diferencias clave:
- Sesiones de DVR:
- La API guarda el manifiesto de DVR en la misma ubicación que los segmentos de la emisión en directo, por lo que no es necesario copiarlo en Cloud Storage. El archivo de manifiesto de la grabación de vídeo es similar al de la emisión en directo, pero más largo. Cuando caduca el periodo de conservación, el manifiesto se elimina junto con los archivos de segmento.
- Puedes crear una sesión de grabación para contenido pasado, actual y futuro. Por ejemplo, una sesión de DVR puede seguir a una emisión en directo o puedes programar una sesión de DVR para que empiece y termine en un momento posterior.
- Un caso de uso habitual de las sesiones de DVR es admitir las funciones de DVR en eventos de streaming en directo. Por ejemplo, un usuario puede unirse a la emisión en directo una hora después de que empiece y ver el contenido con una hora de retraso (o saltarse partes).
- Clips del canal:
- La API Live Stream copia el manifiesto del clip y los archivos de segmento asociados en un directorio especificado por el usuario para que no se eliminen cuando caduque el periodo de conservación. Tienes control total sobre el clip.
- Solo se puede recortar el contenido anterior. No se admiten los clips en directo ni la programación de clips futuros.
- Un caso de uso habitual de los clips es archivar una emisión en directo para que esté disponible como archivo de vídeo bajo demanda indefinidamente.
Para obtener más información sobre los clips de canales, consulta Crear clips de VOD a partir de una emisión en directo.
Configurar el Google Cloud proyecto y la autenticación
Si no has creado un Google Cloud proyecto y credenciales, consulta la sección Antes de empezar.Crear un endpoint de entrada
Para crear un endpoint de entrada, usa el método projects.locations.inputs.create
.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_NUMBER
: número de tu proyecto. Google Cloud Se encuentra en el campo Número de proyecto de la página Configuración de gestión de identidades y accesos.LOCATION
: ubicación en la que se creará el punto final de entrada. 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: identificador definido por el usuario del nuevo endpoint de entrada que se va a crear (al que se envía el flujo de entrada). Este valor debe tener entre 1 y 63 caracteres, empezar y terminar con[a-z0-9]
, y puede incluir guiones (-) entre caracteres. Por ejemplo,my-input
.
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "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 (OLD) que puedes usar para monitorizar el progreso de tu solicitud. Consulta más información en el artículo sobre cómo gestionar operaciones de larga duración .
Obtener detalles de un endpoint de entrada
Para obtener los detalles del endpoint de entrada, utiliza el método projects.locations.inputs.get
.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_NUMBER
: número de tu proyecto. Google Cloud Se encuentra en el campo Número de proyecto de la página Configuración de gestión de identidades y accesos.LOCATION
: la ubicación de tu endpoint de entrada. 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: identificador definido por el usuario del endpoint de entrada
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "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 el valor devuelto
INPUT_STREAM_URI para usarlo más adelante
en la sección Enviar el flujo de prueba de entrada.
Crear canales
Para crear un canal, usa el método projects.locations.channels.create
. En los siguientes ejemplos se crea un canal que genera una emisión en directo HLS. La emisión en directo
consta de una sola versión en alta definición (1280x720).
Para habilitar la creación de sesiones de DVR, añade el objeto retentionConfig
a la configuración del canal.
"retentionConfig": {
"retentionWindowDuration": {
"seconds": 86400
}
},
Cuando se habilita la conservación en un canal de emisión en directo, los segmentos y el manifiesto de la emisión en directo se conservan para crear sesiones de DVR. El objeto retentionWindowDuration
especifica el tiempo durante el que se guarda la salida de la emisión en directo después de subirse a Cloud Storage. El periodo de retención comienza en el momento en que se crea el segmento en Cloud Storage.
La ventana de conservación está limitada a 30 días. Una vez transcurrido el periodo de conservación, los archivos de segmento, el manifiesto de la emisión en directo y el manifiesto de la DVR se eliminan automáticamente de Cloud Storage. No puedes crear sesiones de grabación de vídeo digital (DVR) con segmentos eliminados. 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 sesiones de DVR. Esta clave se utiliza al crear la sesión. Solo se admiten manifiestos HLS.
"manifests": [
{
...
"key": "manifest_hls"
}
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_NUMBER
: número de tu proyecto. Google Cloud Se encuentra en el campo Número de proyecto de la página Configuración de gestión de identidades y accesos.LOCATION
: la ubicación en la que se creará el 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: identificador definido por el usuario del canal que se va a crear. Este valor debe tener entre 1 y 63 caracteres, empezar y terminar con[a-z0-9]
, y puede contener guiones (-) entre caracteres.INPUT_ID
: identificador definido por el usuario del endpoint de entradaBUCKET_NAME
: el nombre del segmento de Cloud Storage que has creado para alojar el manifiesto de la emisión en directo y los archivos de segmento
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "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 (OLD) que puedes usar para monitorizar el progreso de tu solicitud. Consulta más información en el artículo sobre cómo gestionar operaciones de larga duración .
Iniciar el canal
Para iniciar un canal, utiliza el método projects.locations.channels.start
.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_NUMBER
: número de tu proyecto. Google Cloud Se encuentra en el campo Número de proyecto de la página Configuración de gestión de identidades y accesos.LOCATION
: la ubicación de tu canal. Elige 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: identificador definido por el usuario del canal
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "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 (OLD) que puedes usar para monitorizar el progreso de tu solicitud. Consulta más información en el artículo sobre cómo gestionar operaciones de larga duración .
Enviar el flujo de prueba de entrada
Abre una nueva ventana de terminal. Ejecuta el siguiente comando con INPUT_STREAM_URI de la sección Obtener detalles del endpoint de entrada:
ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
-acodec aac -vcodec h264 -f flv INPUT_STREAM_URI
Crear una sesión de DVR
Para crear una sesión de DVR, usa el método projects.locations.channels.dvrSessions.create
.
Usa el campo manifestKey
de la matriz dvrManifests
para especificar el manifiesto del que se va a guardar el contenido. En el ejemplo de configuración de canal de esta página, esta clave tiene el valor manifest_hls
.
Puedes combinar varias secciones de tiempo de la emisión en directo en una sola sesión de DVR añadiendo objetos timeInterval
al array dvrWindows
.
"dvrManifests": [
{
"manifestKey": "manifest_hls"
}
],
"dvrWindows": [
{
"timeInterval": {
"startTime": "2022-07-08T23:03:20.000Z",
"endTime": "2022-07-08T23:04:20.000Z"
}
},
{
"timeInterval": {
"startTime": "2022-07-08T23:05:20.000Z",
"endTime": "2022-07-08T23:06:20.000Z"
}
}
]
Ten en cuenta lo siguiente:
- Cada sesión de grabación de DVR debe contener al menos un
timeInterval
endvrWindows
. - El campo
dvrManifests.manifestKey
debe hacer referencia a un manifiesto HLS definido en el canal principal de la sesión de grabación de vídeo digital. Si la solicitud de creación de la sesión de grabación de vídeo se realiza correctamente, el URI del manifiesto de grabación de vídeo generado se devuelve en el campodvrManifests.outputUri
. Este URI se encuentra en la ruta especificada en el campooutputUri
del canal. - La matriz
dvrManifests
solo admite un archivo de manifiesto por solicitud. Si quieres generar varios manifiestos para las mismas ventanas de DVR, debes dividir los manifiestos en varias sesiones de DVR. - El conjunto de objetos
timeInterval
no debe superponerse y debe estar en orden cronológico. ElstartTime
debe ser anterior alendTime
en todos lostimeInterval
. startTime
yendTime
hacen referencia a la línea de tiempo de la emisión en directo. Si la opción Código de tiempo insertado está habilitada en el manifiesto, esta línea de tiempo se basa en el código de tiempo insertado proporcionado en el flujo de entrada y puede diferir del reloj de pared.- La duración total máxima de la ventana de DVR es de 24 horas.
- El
endTime
del últimotimeInterval
dedvrWindows
puede dejarse vacío. En este caso, elendTime
se calcula automáticamente para maximizar la duración de la sesión de DVR (es decir, una duración total de 24 horas). - Las ventanas de DVR pueden abarcar cualquier periodo, incluidos los futuros.
Sin embargo, el número de sesiones de DVR con
dvrWindows
que se extiendan a un momento futuro está limitado a una. - No hay límite en el número de sesiones de DVR en las que todas las ventanas de DVR se encuentran estrictamente en el pasado.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_NUMBER
: número de tu proyecto. Google Cloud Se encuentra en el campo Número de proyecto de la página Configuración de gestión de identidades y accesos.LOCATION
: la ubicación de tu canal. Elige 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: identificador definido por el usuario del canalDVR_SESSION_ID
: identificador definido por el usuario de la sesión de DVR.INTERVAL_START_TIME
: marca de tiempo de inicio de la época de Unix en el manifiesto de la emisión en directo original. Usa una marca de tiempo en formato RFC3339 UTC "Zulu" (por ejemplo,2014-10-02T15:01:23Z
).INTERVAL_END_TIME
: hora de inicio de la marca de tiempo de Unix en el manifiesto de la emisión en directo original. Usa una marca de tiempo en formato RFC3339 UTC "Zulu" (por ejemplo,2014-10-02T15:01:23Z
).
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "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/dvrSessions/DVR_SESSION_ID", "verb": "create", "requestedCancellation": false, "apiVersion": "v1" }, "done": false }
Este comando crea una operación de larga duración (OLD) que puedes usar para monitorizar el progreso de tu solicitud. Consulta más información en el artículo sobre cómo gestionar operaciones de larga duración .
Obtener la sesión de DVR
Para obtener una sesión de grabación de vídeo digital, usa el método projects.locations.channels.dvrSessions.get
.
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_NUMBER
: número de tu proyecto. Google Cloud Se encuentra en el campo Número de proyecto de la página Configuración de gestión de identidades y accesos.LOCATION
: la ubicación de tu canal. Elige 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: identificador definido por el usuario del canalDVR_SESSION_ID
: identificador definido por el usuario de la sesión de DVR.
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID", "createTime": CREATE_TIME, "startTime": START_TIME, "updateTime": UPDATE_TIME, "state": "SUCCEEDED", "dvrManifests": [ { "manifestKey": "manifest_hls", "outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8" } ], "dvrWindows": [ { "timeInterval": { "startTime": "INTERVAL_START_TIME", "endTime": "INTERVAL_END_TIME" } } ] }
La respuesta debe contener un campo state
que indique el estado de la sesión:
{
...
"state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
...
}
Consulta la documentación de referencia de state
para ver la lista de estados y sus descripciones.
Verificar el contenido del segmento
Abre el segmento de Cloud Storage especificado en el campo dvrManifests.outputUri
de la sesión de DVR. Verifica que contiene los siguientes archivos y directorios:
- Un manifiesto de nivel superior de la sesión de DVR con el mismo nombre que el
manifests.fileName
especificado en la configuración del canal (por ejemplo,main.m3u8
). Puedes reproducir este manifiesto con un reproductor multimedia online. - Un subdirectorio para cada
muxStreams.key
especificado en el canal (por ejemplo,mux_video_ts
). Cada subdirectorio contiene una lista de reproducción de la sesión de DVR (por ejemplo,index-1.m3u8
).
Reproducir la sesión de DVR
Para reproducir el archivo multimedia generado en Shaka Player, sigue estos pasos:
- Haz que el segmento de Cloud Storage que has creado se pueda leer públicamente.
- Para habilitar el uso compartido de recursos entre dominios (CORS) en un segmento de Cloud Storage, sigue estos pasos:
- Crea un archivo JSON que contenga lo siguiente:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
Ejecuta el siguiente comando después de sustituir
JSON_FILE_NAME
por el nombre del archivo JSON que has creado en el paso anterior:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crea un archivo JSON que contenga lo siguiente:
- En el segmento de Cloud Storage, busca el archivo generado. En la columna Acceso público del archivo, haz clic en Copiar URL.
- Ve a Shaka Player, un reproductor de emisiones en directo online.
- En la barra de navegación superior, haga clic en Contenido personalizado.
- Haz clic en el botón +.
Pega la URL pública del archivo en el cuadro URL del manifiesto.
Escribe un nombre en el cuadro Nombre.
Haz clic en Guardar.
Haz clic en Reproducir.
Deberías ver una carta de ajuste como emisión en directo.
Eventos de pausas publicitarias
Si has creado un evento de pausa publicitaria para la emisión en directo, la sesión de DVR contiene los segmentos de anuncios tal como aparecen en la emisión en directo.