← Volver al blog
Guías #recording

Grabar una sala en S3 y obtener un VOD

Iniciá una grabación con una llamada, dejá que egress y el job de subida hagan el resto, y terminá con un VOD reproducible en tu propio bucket. Incluye partes divididas y capturas.

2 min de lectura
Read in English

De sala en vivo a VOD en tres movimientos

Grabar en StreamHub es una operación de disparar-y-olvidar: la iniciás, y un pipeline en segundo plano convierte la sala en vivo en un VOD subido e indexado en el bucket S3 de tu app.

Asegurate primero de que la app tenga S3 configurado (mirá la guía de S3 por app), y luego:

Iniciar la grabación

curl -s -X POST $BASE/apps/live/recording/start \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"roomName":"studio"}'

Recibís un handle de grabación:

{ "data": { "vodId": 12, "egressId": "EG_xxx", "status": "recording" } }

Detrás de escena, egress de LiveKit empieza a escribir un MP4 local y se inserta una fila VOD con status=recording. Dispara el webhook recording_started.

Dejá que el pipeline lo termine

No hacés polling ni lo vigilás. Cuando egress termina:

  1. el estado del archivo pasa a uploading y se encola un job de subida,
  2. el job sube al S3 de la app, construye una URL pública/prefirmada, genera una captura y borra el archivo local,
  3. el estado pasa a ready, se guardan los metadatos (duración, resolución, códec) y dispara vod_ready.

Si la subida falla, el archivo local se conserva y dispara recording_failed — nada se pierde en silencio.

Grabar un stream ya en vivo

Si un stream ya está publicando, grabalo en el lugar por id de stream:

curl -s -X POST $BASE/apps/live/streams/<id>/record/start \
  -H "Authorization: Bearer $TOKEN"

Detené cualquiera de los dos con recording/:id/stop.

Partes divididas y capturas

La forma de la salida viene de la config de la app, no de la petición:

  • split_minutes > 0 corta la grabación cada N minutos — cada parte se vuelve su propio VOD, perfecto para cámaras 24/7. Valores permitidos incluyen 15, 30, 60, 90, 120.
  • snapshot_seconds > 0 toma una miniatura JPEG periódica durante la grabación.

También podés capturar un cuadro puntual en cualquier momento:

curl -s -X POST $BASE/apps/live/snapshots \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"room":"studio"}'

Mirar el VOD

Una vez en status=ready, el VOD tiene una URL reproducible (prefirmada o pública según tu config), servida por el reproductor de VOD de video.js. Como las grabaciones respetan max_recording_minutes_month, podés poner un tope de gasto por tenant mientras seguís grabando todo lo que importa.