En esta página, se muestra cómo crear una sesión de grabador de video digital (DVR) a partir de una transmisión en vivo con la API de Live Stream. Puedes ver una sesión de DVR durante una transmisión en vivo y después de que finalice.
Diferencias entre las sesiones de DVR y los clips de canal
Las sesiones de DVR son similares a los clips de canal (también conocidos como clips de VOD) 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 transmisión en vivo para que no se realicen copias adicionales en Cloud Storage. El manifiesto del DVR es similar al manifiesto de la transmisión en vivo, pero es más largo. Cuando vence la ventana de retención, se borra el manifiesto junto con los archivos de segmento.
- Puedes crear una sesión de DVR para contenido pasado, actual y futuro. Por ejemplo, una sesión de DVR puede seguir una transmisión en vivo, o bien puedes programar una sesión de DVR para que comience y se detenga en un momento futuro.
- Un caso de uso típico para las sesiones de DVR es admitir las funciones de DVR para eventos de transmisión en vivo. Por ejemplo, un usuario puede unirse a la transmisión en vivo una hora después de que comienza y ver el contenido con una demora de una hora (o omitir partes de él).
- Clips del canal:
- La API de Live Stream copia el manifiesto del clip y los archivos de segmentos asociados a un directorio especificado por el usuario para que no se borren cuando venza la ventana de retención. Tienes el control total del clip.
- Solo se puede recortar el contenido anterior. No se admiten clips en vivo ni la programación de clips futuros.
- Un caso de uso típico de los clips es archivar una transmisión en vivo para que esté disponible como archivo de VOD de forma indefinida.
Para obtener más información sobre los clips del canal, consulta Cómo crear clips de VOD a partir de una transmisión en vivo.
Configura el proyecto de Google Cloud y la autenticación
Si no creaste un proyecto de Google Cloud ni credenciales, consulta Antes de comenzar.Crea un extremo de entrada
Para crear un extremo de entrada, usa el método 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.Cómo 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
: 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 hacer 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 método 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
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 el INPUT_STREAM_URI que se muestra para usarlo más adelante en la sección Envía la transmisión de prueba de entrada.
Crea un canal
Para crear un canal, usa el método projects.locations.channels.create
. En los siguientesตัวอย่าง, se crea un canal que genera una transmisión en vivo de HLS. La transmisión en vivo consiste en una sola versión de alta definición (1280 x 720).
Para habilitar la creación de sesiones de DVR, agrega el objeto 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 retienen los segmentos y el manifiesto de la transmisión para crear sesiones de DVR. 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 que haya transcurrido la ventana de retención, los archivos de segmentos, el manifiesto de transmisión en vivo y el manifiesto de DVR se borrarán automáticamente de Cloud Storage. No puedes crear sesiones de DVR 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 sesiones de DVR. Te refieres a esta clave cuando creas la sesión. 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-south1
asia-northeast1
asia-southeast1
australia-southeast1
europe-north1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: Es un identificador definido por el usuario para el canal que se creará. Este valor debe tener entre 1 y 63 caracteres, comenzar y terminar con[a-z0-9]
, y puede contener guiones (-) entre los caracteres.INPUT_ID
: Es el identificador definido por el usuario para el extremo de entrada.BUCKET_NAME
: Es el nombre del bucket de Cloud Storage que creaste para contener el manifiesto y los archivos de segmentos de la transmisión en vivo.
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.
Inicia 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 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 tu canal. Usa una de las regiones admitidas.Cómo 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
: 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.
Envía la transmisión de prueba de entrada
Abre una nueva ventana de la terminal. Ejecuta el siguiente comando con INPUT_STREAM_URI de la 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
Crea 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
en el array dvrManifests
para especificar el manifiesto desde el que se guardará el contenido. En la configuración de canales de ejemplo en esta página, esta clave se establece en manifest_hls
.
Para combinar varias secciones de tiempo de la transmisión en vivo en una sola sesión de DVR, agrega 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 DVR debe contener al menos un
timeInterval
endvrWindows
. - El campo
dvrManifests.manifestKey
debe hacer referencia a un manifiesto HLS definido en el canal superior de la sesión de DVR. Si la solicitud de creación de sesión de DVR se realiza correctamente, se muestra el URI del manifiesto de DVR generado en el campodvrManifests.outputUri
. Este URI se encuentra en la ruta de acceso que especifica el campooutputUri
del canal. - El array
dvrManifests
solo admite un manifiesto por solicitud. Si deseas 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 que elendTime
en cadatimeInterval
. startTime
yendTime
hacen referencia al cronograma de la transmisión en vivo. Si el código de tiempo incorporado está habilitado para el manifiesto, esta línea de tiempo se basa en el código de tiempo incorporado proporcionado en la transmisión 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
endvrWindows
se puede dejar vacío. En este caso,endTime
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 período, incluidos los futuros.
Sin embargo, la cantidad de sesiones de DVR con
dvrWindows
que se extienden a un momento futuro se limita a una. - No hay límite para la cantidad de sesiones de DVR en las que todas las ventanas de DVR se encuentran estrictamente en el pasado.
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 tu canal. Usa una de las regiones admitidas.Cómo 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
: Es un identificador definido por el usuario para el canal.DVR_SESSION_ID
: Es un identificador definido por el usuario para la sesión de DVR.INTERVAL_START_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
).INTERVAL_END_TIME
: Es el tiempo de época Unix marcado 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
).
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/dvrSessions/DVR_SESSION_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.
Cómo obtener la sesión de DVR
Para obtener una sesión de DVR, usa el método projects.locations.channels.dvrSessions.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 tu canal. Usa una de las regiones admitidas.Cómo 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
: Es un identificador definido por el usuario para el canal.DVR_SESSION_ID
: Es un identificador definido por el usuario para la sesión de DVR.
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/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 obtener la lista de estados y sus descripciones.
Verifica el contenido del bucket
Abre el bucket de Cloud Storage como se especifica en el campo dvrManifests.outputUri
de la sesión de DVR. Verifica que contenga los siguientes archivos y directorios:
- Un manifiesto de nivel superior para 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 en línea. - Un subdirectorio para cada
muxStreams.key
especificado en el canal (por ejemplo,mux_video_ts
). Cada subdirectorio contiene una playlist para 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:
- 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 generado. 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 pausas publicitarias
Si creaste un evento de pausa publicitaria para la transmisión en vivo, la sesión del DVR contiene los segmentos de anuncios tal como aparecen en la transmisión en vivo.