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.10800por 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.4por 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
packingno escompat— solo se exporta el MP4 clásico; filter.tracksno 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 etiquetareason.
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¶
- Reproducción del archivo — retroceso y ventana por tiempo absoluto.
- Grabación y lectura — dónde se escribe el archivo y cómo se comprueba la grabación.
- Monitorización — adónde van los contadores de exportación.