Skip to content

Exportación del archivo

Un tramo del archivo grabado se descarga en un solo archivo MP4 que abre en reproductores habituales, por ejemplo VLC. El archivo se arma con el archivo en el momento de la petición: no hay que preparar nada de antemano, y la exportación no ocupa espacio en disco.

La exportación funciona en un stream con la grabación activada. Solo se exporta MP4: la cabecera no arma un archivo MPEG-TS, y una petición .ts se rechaza con 422.

Dirección de exportación

http://<dirección-de-la-cabecera>/streaming/v/<stream>/archive-<desde>-<duración>.mp4
  • desde — el comienzo del tramo, en UTC y segundos;
  • duración — la longitud del tramo, en segundos.

Por ejemplo, archive-1789546139-600.mp4 son diez minutos de archivo a partir del momento indicado.

La cabecera responde a GET con el archivo y a HEAD solo con sus cabeceras. Conviene probar la dirección con HEAD antes de descargar: Content-Length llega sin el cuerpo, así que el tamaño del archivo se conoce de antemano. GET y HEAD tienen los mismos desenlaces: una negativa que daría la descarga ya se ve en la prueba.

Selección de pistas

Sin parámetros, el archivo recibe todas las pistas de vídeo y audio del tramo. Las pistas necesarias se eligen con el parámetro filter.tracks:

http://<dirección-de-la-cabecera>/streaming/v/<stream>/archive-<desde>-<duración>.mp4?filter.tracks=v1a1

Las pistas se nombran igual que en las listas: v1, v2 son vídeo, a1 es audio. Si en el archivo no entra ninguna pista de vídeo, se sirve como audio/mp4.

Los subtítulos y las pistas de servicio no entran en la exportación: rompen la compatibilidad del contenedor clásico por la que precisamente se eligió. La petición de una pista así se rechaza.

Qué entra en el archivo

  • El comienzo — el archivo empieza en el fotograma clave no posterior al momento pedido, por lo que puede ser unos segundos más largo que lo pedido. Si el comienzo cae en un hueco de grabación, el archivo empieza en el primer fotograma clave después del hueco;
  • los huecos de grabación — se unen: en el archivo solo hay tiempo grabado, y puede resultar más corto que el tramo pedido;
  • un cambio de parámetros de la pista — si dentro del tramo cambiaron los parámetros, por ejemplo la resolución, el archivo termina en el punto del cambio. El corte es común a todas las pistas: si no, la imagen terminaría a mitad del sonido.

La cabecera propone el nombre del archivo en la cabecera Content-Disposition:

<stream>_<AAAA-MM-DD>_<HH-MM-SS>Z_<segundos>s.mp4

La hora del nombre es UTC y la duración es la realmente grabada, no el ancho de la selección: el nombre no debe mentir sobre el contenido.

Límites

Dos límites viven en la configuración del archivo de la máquina y sobreviven al reinicio: cambian al aplicar la configuración, no al reiniciar.

  • export_max_duration_secs — la duración máxima de una exportación, en segundos. 10800 por omisión — tres horas, lo mismo que la línea de tiempo permite seleccionar por omisión;
  • export_max_concurrent — cuántas exportaciones ejecuta la cabecera a la vez. 4 por omisión.

Una petición más larga que el techo se rechaza con 422 antes de leer el archivo. Una petición por encima del número de simultáneas recibe 503 con la cabecera Retry-After: reintentar tras los segundos indicados no pierde nada, el trabajo no había empezado.

El valor cero no se admite. El techo de duración recorta una exportación, pero no su número: decenas a la vez ponen el disco en apuros, y la cabecera además está grabando.

Respuestas del servidor

Código Cuándo
200 el archivo se está sirviendo
403 el stream está cifrado: la exportación clásica no lleva cifrado
404 en el tramo no hay grabación
422 la petición no se puede cumplir, el motivo se nombra en el cuerpo de la respuesta
503 ya se está ejecutando el número máximo de exportaciones; reintentar tras Retry-After segundos

Motivos del código 422:

  • la duración supera el techo export_max_duration_secs;
  • se nombra una pista inexistente — o el stream no tiene esa pista, o en el tramo no tiene grabación;
  • se piden subtítulos o una pista de servicio;
  • el contenedor no es MP4 — la extensión de la dirección es otra;
  • el parámetro packing no es compat — solo se exporta el MP4 clásico;
  • filter.tracks no es una designación de pistas;
  • la duración viene como now — la exportación «hasta el momento actual» no se admite: entre la prueba y la descarga el borde del archivo se mueve, y la longitud anunciada no cuadraría con el cuerpo.

Si la entrega se corta ya después de las cabeceras — por ejemplo, falla el disco —, la respuesta termina como una transferencia incompleta: curl informa de una conexión cortada y el navegador marca la descarga como fallida. Un archivo que llegó entero contiene todo el tramo.

Contadores

La exportación se cuenta junto con el resto de las métricas del proceso (véase Monitorización):

  • archive_export_requests_total — número de exportaciones servidas;
  • archive_export_recorded_secs_total — segundos de grabación exportados;
  • archive_export_bytes_total — bytes exportados;
  • archive_export_failures_total — negativas con la etiqueta reason.

Las negativas por culpa del cliente y por culpa de la cabecera se separan a propósito: una petición inválida no es señal de avería, y no hay que despertar a nadie por ella.

Qué sigue