vod: Empaquetador VOD basado en NGINX
Instalación
Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-vod
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-vod
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_http_vod_module.so;
Este documento describe nginx-module-vod v1.33 lanzado el 01 de enero de 2024.
nginx-vod-module 
Únete a la lista de organizaciones que utilizan este proyecto de empaquetador de video.
Para transmisión de video en vivo, por favor usa Media-Framework.
Características
-
Reempaquetado en tiempo real de archivos MP4 a DASH, HDS, HLS, MSS
-
Modos de trabajo:
- Local - servir archivos accesibles localmente (disco local/NFS montado)
- Remoto - servir archivos accesibles a través de HTTP utilizando solicitudes de rango
-
Mapeado - servir archivos de acuerdo a una especificación codificada en formato JSON. El JSON puede ser obtenido de un servidor remoto o leído desde un archivo local
-
Soporte para bitrate adaptativo
-
Soporte para listas de reproducción (reproduciendo varios archivos de medios diferentes uno tras otro) - solo en modo mapeado
-
Soporte para simulación de en vivo (generando una transmisión en vivo a partir de archivos MP4) - solo en modo mapeado
-
Soporte de respaldo para archivos no encontrados en modos local/mapeado (útil en entornos de múltiples centros de datos)
-
Codecs de video: H264, H265 (DASH/HLS), AV1 (DASH/HLS), VP8 (DASH), VP9 (DASH)
-
Codecs de audio: AAC, MP3 (HLS/HDS/MSS), AC-3 (DASH/HLS), E-AC-3 (DASH/HLS), VORBIS (DASH), OPUS (DASH), FLAC (HLS), DTS (HLS)
-
Soporte para subtítulos -
Entrada: 1. WebVTT 2. SRT 3. DFXP/TTML 4. CAP (Cheetah)
Salida: 1. DASH - ya sea un solo WebVTT o segmentos SMPTE-TT (configurable) 2. HLS - WebVTT segmentado (m3u8) 3. MSS - convertido a TTML y empaquetado en MP4 fragmentado (sin soporte para estilo)
-
Archivos solo de audio/video
-
Alternativas de audio - soportando ambos:
- Generación de manifiesto con diferentes alternativas de audio, permitiendo selección del lado del cliente
-
Multiplexión de flujos de audio y video de archivos/pistas separados - proporciona la capacidad de servir diferentes alternativas de audio de un solo video, sin necesidad de soporte especial del lado del cliente.
-
Selección de pistas para archivos MP4 de audio/video múltiples
-
Cambio de tasa de reproducción - 0.5x hasta 2x (requiere libavcodec y libavfilter)
-
Recorte de archivos fuente (solo de I-Frame a P-frame)
-
Soporte para longitudes de segmento variables - permitiendo al reproductor seleccionar el bitrate óptimo rápidamente, sin la sobrecarga de segmentos cortos durante toda la duración del video
-
Recorte de archivos MP4 para reproducción de descarga progresiva
-
Captura de miniaturas (requiere libavcodec) y redimensionado (requiere libswscale)
-
Mapa de volumen (requiere libavcodec) - devuelve un CSV que contiene el nivel de volumen en cada intervalo
-
Desencriptación de archivos MP4 encriptados con CENC (es posible crear tales archivos con MP4Box)
-
DASH: soporte de cifrado común (CENC)
-
MSS: soporte de cifrado PlayReady
-
HLS: generación de lista de reproducción de I-frames (EXT-X-I-FRAMES-ONLY)
-
HLS: soporte para cifrado AES-128 / SAMPLE-AES
Limitaciones
-
La selección de pistas y el cambio de tasa de reproducción no son compatibles en descarga progresiva
-
La generación de listas de reproducción de I-frames no es compatible cuando la encriptación está habilitada
-
Probado solo en Linux
rpm -ihv http://installrepo.kaltura.org/releases/kaltura-release.noarch.rpm
yum install kaltura-nginx
#### Paquete deb de Debian/Ubuntu
*Nota de Ubuntu: antes de intentar instalar kaltura-nginx, también debes asegurarte de que el repositorio multiverse esté habilitado*
Para Debian Wheezy [7], Debian Jessie [8], Ubuntu 14.04 y 14.10, añade este repositorio:
```sh
## wget -O - http://installrepo.kaltura.org/repo/apt/debian/kaltura-deb-curr.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/apt/debian propus main" > /etc/apt/sources.list.d/kaltura.list
Para Ubuntu 16.04, 16.10 añade este repositorio:
## wget -O - http://installrepo.kaltura.org/repo/apt/xenial/kaltura-deb-curr-256.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/apt/xenial propus main" > /etc/apt/sources.list.d/kaltura.list
Para Ubuntu 20.04 añade este repositorio:
## wget -O - http://installrepo.kaltura.org/repo/aptn/focal/kaltura-deb-256.gpg.key|apt-key add -
## echo "deb [arch=amd64] http://installrepo.kaltura.org/repo/aptn/focal quasar main" > /etc/apt/sources.list.d/kaltura.list
Luego instala el paquete kaltura-nginx:
## apt-get update
## apt-get install kaltura-nginx
Si deseas hacer uso de las siguientes características: - Captura de miniaturas - Cambio de tasa de reproducción - 0.5x hasta 2x
También necesitarás instalar el paquete kaltura-ffmpeg (>= 3.1).
Estructura de URL
Estructura básica de URL
La estructura básica de una URL de nginx-vod-module es:
http://<dominio>/<ubicación>/<fileuri>/<nombrearchivo>
Donde:
* dominio - el dominio del servidor nginx-vod-module
* ubicación - la ubicación especificada en la configuración de nginx
* fileuri - un URI al archivo mp4:
* modo local - la ruta completa del archivo se determina de acuerdo con las directivas root / alias de nginx.conf
* modo mapeado - la ruta completa del archivo se determina de acuerdo con el JSON recibido del upstream / archivo local
* modo remoto - el archivo mp4 se lee del upstream en fragmentos
* Nota: en modos mapeado y remoto, la URL de la solicitud upstream es http://<upstream>/<ubicación>/<fileuri>?<extraargs>
(extraargs se determina por el parámetro vod_upstream_extra_args)
* nombrearchivo - detallado a continuación
Estructura de múltiples URL
Las múltiples URL se utilizan para codificar varias URL en una sola URL. Una URL múltiple puede ser utilizada para especificar las URL de varios archivos MP4 diferentes que deberían ser incluidos juntos en un MPD DASH, por ejemplo.
La estructura de una URL múltiple es:
http://<dominio>/<ubicación>/<prefijo>,<medio1>,<medio2>,<medio3>,<postfijo>.urlset/<nombrearchivo>
La URL de muestra anterior representa 3 URL:
* http://<dominio>/<ubicación>/<prefijo><medio1><postfijo>/<nombrearchivo>
* http://<dominio>/<ubicación>/<prefijo><medio2><postfijo>/<nombrearchivo>
* http://<dominio>/<ubicación>/<prefijo><medio3><postfijo>/<nombrearchivo>
El sufijo .urlset (puede ser cambiado usando vod_multi_uri_suffix) indica que la URL debe ser tratada como una URL múltiple.
Por ejemplo - la URL http://example.com/hls/videos/big_buck_bunny_,6,9,15,00k.mp4.urlset/master.m3u8 devolverá un manifiesto que contiene:
* http://example.com/hls/videos/big_buck_bunny_600k.mp4/index.m3u8
* http://example.com/hls/videos/big_buck_bunny_900k.mp4/index.m3u8
* http://example.com/hls/videos/big_buck_bunny_1500k.mp4/index.m3u8
Parámetros de ruta de URL
Los siguientes parámetros son compatibles en la ruta de la URL:
* clipFrom - un desplazamiento en milisegundos desde el comienzo del video, donde debería comenzar la transmisión generada.
Por ejemplo, .../clipFrom/10000/... generará una transmisión que comienza 10 segundos en el video.
* clipTo - un desplazamiento en milisegundos desde el comienzo del video, donde debería terminar la transmisión generada.
Por ejemplo, .../clipTo/60000/... generará una transmisión truncada a 60 segundos.
* tracks - puede ser utilizado para seleccionar pistas de audio/video específicas. La estructura del parámetro es: v<id1>-v<id2>-a<id1>-a<id2>...
Por ejemplo, .../tracks/v1-a1/... seleccionará la primera pista de video y la primera pista de audio.
El valor predeterminado es incluir todas las pistas.
* shift - puede ser utilizado para aplicar un desplazamiento de tiempo a uno o más flujos. La estructura del parámetro es: v<vshift>-a<ashift>-s<sshift>
Por ejemplo, .../shift/v100/... aplicará un desplazamiento hacia adelante de 100ms a las marcas de tiempo de video.
Estructura del nombre de archivo
La estructura del nombre de archivo es:
<basename>[<seqparams>][<fileparams>][<trackparams>][<langparams>].<extension>
Donde:
* basename + extension - el conjunto de opciones es específico del empaquetador (la lista a continuación se aplica a la configuración predeterminada):
* dash - manifest.mpd
* hds - manifest.f4m
* lista de reproducción maestra hls - master.m3u8
* lista de reproducción de medios hls - index.m3u8
* mss - manifest
* thumb - thumb-<offset>[<resizeparams>].jpg (offset es el desplazamiento de video de la miniatura en milisegundos)
* volume_map - volume_map.csv
* seqparams - puede ser utilizado para seleccionar secuencias específicas por id (proporcionado en el JSON de mapeo), e.g. master-sseq1.m3u8.
* fileparams - puede ser utilizado para seleccionar secuencias específicas por índice al usar múltiples URL.
Por ejemplo, manifest-f1.mpd devolverá un MPD solo del primer URL.
* trackparams - puede ser utilizado para seleccionar pistas de audio/video específicas.
Por ejemplo, manifest-a1.f4m devolverá un F4M que contiene solo el primer flujo de audio de cada secuencia.
El valor predeterminado es incluir las primeras pistas de audio y video de cada archivo.
Las pistas seleccionadas en el nombre del archivo se combinan con las pistas seleccionadas con el parámetro de ruta /tracks/.
v0/a0 seleccionan todas las pistas de video/audio respectivamente.
Los parámetros a/v pueden combinarse con f/s, e.g. f1-v1-f2-a1 = video1 de archivo1 + audio1 de archivo2, f1-f2-v1 = video1 de archivo1 + video1 de archivo2.
* langparams - puede ser utilizado para filtrar pistas de audio/subtítulos de acuerdo a su idioma (código ISO639-3).
Por ejemplo, master-leng.m3u8 devolverá solo pistas de audio en inglés.
* resizeparams - puede ser utilizado para redimensionar la imagen de miniatura devuelta. Por ejemplo, thumb-1000-w150-h100.jpg captura una miniatura
1 segundo en el video, y la redimensiona a 150x100. Si una de las dimensiones se omite, su valor se establece para que la
imágen resultante mantenga la relación de aspecto del cuadro de video.
Formato de respuesta de mapeo
Cuando se configura para funcionar en modo mapeado, nginx-vod-module emite una solicitud HTTP a un servidor upstream configurado para recibir el diseño de los flujos de medios que debería generar. La respuesta debe estar en formato JSON.
Esta sección contiene algunos ejemplos simples seguidos de una referencia de los objetos y campos soportados. Pero primero, un par de definiciones:
Source Clip- un conjunto de fotogramas de audio y/o video (pistas) extraídos de un solo archivo de mediosGenerator- un componente que puede generar fotogramas de audio/video. Actualmente, el único generador soportado es el generador de silencio.Filter- una manipulación que puede aplicarse a fotogramas de audio/video. Los siguientes filtros son soportados:- cambio de tasa (velocidad) - se aplica tanto a audio como a video
- cambio de volumen de audio
- mezcla - puede ser utilizada para fusionar varias pistas de audio juntas, o para fusionar el audio de la fuente A con el video de la fuente B
Clip- el resultado de aplicar cero o más filtros a un conjunto de clips fuenteDynamic Clip- un clip cuyo contenido no se conoce de antemano, e.g. contenido publicitario dirigidoSequence- un conjunto de clips que deben reproducirse uno tras otro.Set- varias secuencias que se reproducen juntas como un conjunto adaptativo, cada secuencia debe tener el mismo número de clips.
Mapeo simple
El JSON a continuación mapea la URI de solicitud a un solo archivo MP4:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video.mp4"
}
]
}
]
}
Cuando se utilizan múltiples URL, este es el único patrón JSON permitido. En otras palabras, no es posible combinar JSON más complejos utilizando múltiples URL.
Conjunto adaptativo
Como alternativa al uso de múltiples URL, se puede definir un conjunto adaptativo a través de JSON:
{
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate1.mp4"
}
]
},
{
"clips": [
{
"type": "source",
"path": "/path/to/bitrate2.mp4"
}
]
}
]
}
Lista de reproducción
El JSON a continuación reproducirá 35 segundos de video1 seguido de 22 segundos de video2:
{
"durations": [ 35000, 22000 ],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
Filtros
El JSON a continuación toma video1, lo reproduce a x1.5 y mezcla el audio del resultado con el audio de video2, después de reducirlo al 50% de volumen:
{
"sequences": [
{
"clips": [
{
"type": "mixFilter",
"sources": [
{
"type": "rateFilter",
"rate": 1.5,
"source": {
"type": "source",
"path": "/path/to/video1.mp4"
}
},
{
"type": "gainFilter",
"gain": 0.5,
"source": {
"type": "source",
"path": "/path/to/video2.mp4",
"tracks": "a1"
}
}
]
}
]
}
]
}
En vivo continuo
El JSON a continuación es un ejemplo de una transmisión en vivo continua (=una transmisión en vivo en la que todos los videos tienen exactamente los mismos parámetros de codificación). En la práctica, este JSON tendrá que ser generado por algún script, ya que depende del tiempo. (vea test/playlist.php para una implementación de muestra)
{
"playlistType": "live",
"discontinuity": false,
"segmentBaseTime": 1451904060000,
"firstClipTime": 1451917506000,
"durations": [83000, 83000],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
En vivo no continuo
El JSON a continuación es un ejemplo de una transmisión en vivo no continua (=una transmisión en vivo en la que los videos tienen diferentes parámetros de codificación). En la práctica, este JSON tendrá que ser generado por algún script, ya que depende del tiempo (vea test/playlist.php para una implementación de muestra)
{
"playlistType": "live",
"discontinuity": true,
"initialClipIndex": 171,
"initialSegmentIndex": 153,
"firstClipTime": 1451918170000,
"durations": [83000, 83000],
"sequences": [
{
"clips": [
{
"type": "source",
"path": "/path/to/video1.mp4"
},
{
"type": "source",
"path": "/path/to/video2.mp4"
}
]
}
]
}
Referencia de mapeo
Set (objeto de nivel superior en el JSON de mapeo)
Campos obligatorios:
* sequences - matriz de objetos Sequence.
El mapeo debe contener al menos una secuencia y hasta 32 secuencias.
Campos opcionales:
* id - una cadena que identifica el conjunto. El id puede ser recuperado por $vod_set_id.
* playlistType - cadena, puede ser configurada como live, vod o event (solo soportado para listas de reproducción HLS), el valor predeterminado es vod.
* durations - una matriz de enteros que representan las duraciones de los clips en milisegundos.
Este campo es obligatorio si el mapeo contiene más de un solo clip por secuencia.
Si se especifica, esta matriz debe contener al menos un elemento y hasta 128 elementos.
* discontinuity - booleano, indica si los diferentes clips en cada secuencia tienen
diferentes parámetros de medios. Este campo tiene diferentes manifestaciones de acuerdo con el
protocolo de entrega - un valor de verdadero generará #EXT-X-DISCONTINUITY en HLS,
y un MPD de múltiples períodos en DASH. El valor predeterminado es verdadero, se establece en falso solo si los archivos
de medios fueron transcodificados con exactamente los mismos parámetros (en AVC por ejemplo,
los clips deben tener exactamente el mismo SPS/PPS).
* segmentDuration - entero, establece la duración del segmento en milisegundos. Este campo,
si se especifica, tiene prioridad sobre el valor establecido en vod_segment_duration.
* consistentSequenceMediaInfo - booleano, actualmente afecta solo a DASH. Cuando se establece en verdadero (predeterminado)
el MPD informará los mismos parámetros de medios en cada elemento de período. Configurarlo en falso
puede tener graves implicaciones de rendimiento para secuencias largas (nginx-vod-module tiene
que leer la información de medios de todos los clips incluidos en el mapeo para generar el MPD)
* referenceClipIndex - entero, establece el índice (basado en 1) del clip que debe ser utilizado
para recuperar los metadatos de video para solicitudes de manifiesto (códec, ancho, alto, etc.)
Si consistentSequenceMediaInfo está configurado en falso, este parámetro no tiene efecto -
todos los clips son analizados. Si este parámetro no se especifica, nginx-vod-module utiliza el último clip
por defecto.
* notifications - matriz de objetos de notificación (ver más abajo), cuando se solicita un segmento,
todas las notificaciones que caen entre los tiempos de inicio/fin del segmento son activadas.
las notificaciones deben estar ordenadas en un orden de desplazamiento creciente.
* clipFrom - entero, contiene una marca de tiempo que indica dónde debería comenzar el flujo devuelto.
Establecer este parámetro es equivalente a pasar /clipFrom/ en la URL.
* clipTo - entero, contiene una marca de tiempo que indica dónde debería terminar el flujo devuelto.
Establecer este parámetro es equivalente a pasar /clipTo/ en la URL.
* cache - booleano, si se establece en falso, la respuesta de mapeo no se guardará en caché (vod_mapping_cache).
El valor predeterminado es verdadero.
* closedCaptions - matriz de objetos de subtítulos cerrados (ver más abajo), que contienen idiomas e ids
de cualquier subtítulo CEA-608 / CEA-708 incrustado. Si se proporciona una matriz vacía, el módulo producirá
CLOSED-CAPTIONS=NONE en cada etiqueta EXT-X-STREAM-INF. Si la lista no aparece en el JSON, el
módulo no producirá ningún campo CLOSED-CAPTIONS en la lista de reproducción.
Campos en vivo:
* firstClipTime - entero, obligatorio para todas las listas de reproducción en vivo a menos que se especifiquen clipTimes.
Contiene el tiempo absoluto del primer clip en la lista de reproducción, en milisegundos desde la época (unixtime x 1000)
* clipTimes - matriz de enteros, establece el tiempo absoluto de todos los clips en la lista de reproducción,
en milisegundos desde la época (unixtime x 1000). Este campo solo puede ser utilizado cuando
discontinuity está configurado en verdadero. Las marcas de tiempo pueden contener huecos, pero no se permite que se superpongan
(clipTimes[n + 1] >= clipTimes[n] + durations[n])
* segmentBaseTime - entero, obligatorio para transmisiones en vivo continuas, contiene el tiempo absoluto
del primer segmento de la transmisión, en milisegundos desde la época (unixtime x 1000).
Este valor no debe cambiar durante la reproducción.
Para transmisiones en vivo no continuas, este campo es opcional:
* si no se establece, se utilizarán índices de segmento secuenciales a lo largo de la lista de reproducción.
En este caso, el servidor upstream que genera el JSON de mapeo debe mantener el estado,
y actualizar initialSegmentIndex cada vez que un clip es eliminado de la lista de reproducción.
* si se establece, los huecos de tiempo entre clips no deben ser menores que vod_segment_duration.
* firstClipStartOffset - entero, opcional, medido en milisegundos. Este campo contiene la
diferencia entre el tiempo del primer clip y el tiempo de inicio original del primer clip -
el tiempo que tenía cuando fue añadido inicialmente (antes de que la ventana en vivo se desplazara)
* initialClipIndex - entero, obligatorio para transmisiones en vivo no continuas que mezclan videos con
diferentes parámetros de codificación (SPS/PPS), contiene el índice del primer clip en la lista de reproducción.
Cuando un clip es expulsado de la cabeza de la lista de reproducción, este valor debe incrementarse en uno.
* initialSegmentIndex - entero, obligatorio para transmisiones en vivo que no establecen segmentBaseTime,
contiene el índice del primer segmento en la lista de reproducción. Cada vez que un clip es expulsado de la cabeza de
la lista de reproducción, este valor debe incrementarse por el número de segmentos en el clip.
* presentationEndTime - entero, opcional, medido en milisegundos desde la época.
cuando se suministra, el módulo comparará el tiempo actual con el valor suministrado,
y señalará el final de la presentación en vivo si presentationEndTime ha pasado.
En HLS, por ejemplo, este parámetro controla si se debe incluir una etiqueta #EXT-X-ENDLIST
en la lista de reproducción de medios.
Cuando el parámetro no se suministra, el módulo no señalará el final de la presentación en vivo.
* expirationTime - entero, opcional, medido en milisegundos desde la época.
cuando se suministra, el módulo comparará el tiempo actual con el valor suministrado,
y si expirationTime ha pasado, el módulo devolverá un error 404 para solicitudes de manifiesto
(las solicitudes de segmento continuarán siendo atendidas).
cuando tanto presentationEndTime como expirationTime han pasado, presentationEndTime tiene
prioridad, es decir, las solicitudes de manifiesto serán atendidas y se señalará el final de la presentación.
* liveWindowDuration - entero, opcional, proporciona una forma de anular vod_live_window_duration
especificado en la configuración. Si el valor excede el valor absoluto especificado en
vod_live_window_duration, se ignora.
* timeOffset - entero, establece un desplazamiento que debe aplicarse al reloj del servidor al atender
solicitudes en vivo. Este parámetro puede ser utilizado para probar eventos futuros/pasados.
Secuencia
Campos obligatorios:
* clips - matriz de objetos Clip (obligatorio). El número de elementos debe coincidir con el número
de la matriz de duraciones especificada en el conjunto. Si la matriz de duraciones no se especifica,
la matriz de clips debe contener un solo elemento.
Campos opcionales:
* id - una cadena que identifica la secuencia. El id puede ser recuperado por $vod_sequence_id.
* language - un código de idioma de 3 letras (ISO-639-2), este campo tiene prioridad sobre cualquier idioma
especificado en el archivo de medios (átomo mp4 mdhd)
* label - una cadena amigable que identifica la secuencia. Si se especifica un idioma,
una etiqueta predeterminada será derivada automáticamente de él - e.g. si el idioma es ita,
por defecto se utilizará italiano como etiqueta.
* bitrate - un objeto que puede ser utilizado para establecer el bitrate para los diferentes tipos de medios,
en bits por segundo. Por ejemplo, {"v": 900000, "a": 64000}. Si no se suministra el bitrate,
nginx-vod-module lo estimará basado en el último clip en la secuencia.
* avg_bitrate - un objeto que puede ser utilizado para establecer el bitrate promedio para los diferentes tipos de medios,
en bits por segundo. Ver bitrate arriba para un objeto de muestra. Si se especifica, el módulo utilizará
el valor para poblar el atributo AVERAGE-BANDWIDTH de #EXT-X-STREAM-INF en HLS.
Clip (abstracto)
Campos obligatorios:
* type - una cadena que define el tipo del clip. Los valores permitidos son:
* source
* rateFilter
* mixFilter
* gainFilter
* silence
* concat
* dynamic
Campos opcionales:
* keyFrameDurations - matriz de enteros, que contiene las duraciones en milisegundos de los fotogramas clave de video
en el clip. Esta propiedad solo puede ser suministrada en los clips de nivel superior de cada secuencia,
suministrar esta propiedad en clips anidados no tiene efecto.
Suministrar las duraciones de fotogramas clave permite al módulo tanto:
1. alinear los segmentos a los fotogramas clave
2. informar las duraciones de segmento correctas en el manifiesto - proporcionando una alternativa a establecer
vod_manifest_segment_durations_mode en accurate, que no es soportado para conjuntos de medios de múltiples clips (por razones de rendimiento).
* firstKeyFrameOffset - entero, desplazamiento del primer fotograma clave de video en el clip,
medido en milisegundos en relación con firstClipTime. Por defecto es 0 si no se suministra.
Clip fuente
Campos obligatorios:
* type - una cadena con el valor source
* path - una cadena que contiene la ruta del archivo MP4. La cadena "empty" puede ser utilizada para representar
un archivo de subtítulos vacío (útil en caso de que solo algunos videos en una lista de reproducción tengan subtítulos)
Campos opcionales:
* id - una cadena que identifica el clip fuente
* sourceType - establece la interfaz que debe ser utilizada para leer el archivo MP4, los valores permitidos son:
file y http. Por defecto, el módulo utiliza http si vod_remote_upstream_location está establecido,
y file de lo contrario.
* tracks - una cadena que especifica las pistas que deben ser utilizadas, el valor predeterminado es "v1-a1",
lo que significa la primera pista de video y la primera pista de audio
* clipFrom - un entero que especifica un desplazamiento en milisegundos, desde el comienzo del
archivo de medios, desde el cual comenzar a cargar fotogramas
* encryptionKey - una cadena codificada en base64 que contiene la clave (128/192/256 bits) que debe ser utilizada
para desencriptar el archivo.
* encryptionIv - una cadena codificada en base64 que contiene el iv (128 bits) que debe ser utilizada
para desencriptar el archivo.
* encryptionScheme - el esquema de encriptación que fue utilizado para encriptar el archivo. Actualmente,
solo se soportan dos esquemas - cenc para archivos MP4, aes-cbc para archivos de subtítulos.
Clip de filtro de tasa
Campos obligatorios:
* type - una cadena con el valor rateFilter
* rate - un float que especifica el factor de aceleración, e.g. un valor de 2 significa el doble de velocidad.
Los valores permitidos están en el rango 0.5 - 2 con hasta dos puntos decimales
* source - un objeto clip sobre el cual realizar el filtrado de tasa
Clip de filtro de ganancia
Campos obligatorios:
* type - una cadena con el valor gainFilter
* gain - un float que especifica el factor de amplificación, e.g. un valor de 2 significa el doble de volumen.
La ganancia debe ser positiva con hasta dos puntos decimales
* source - un objeto clip sobre el cual realizar el filtrado de ganancia
Clip de filtro de mezcla
Campos obligatorios:
* type - una cadena con el valor mixFilter
* sources - una matriz de objetos Clip para mezclar. Esta matriz debe contener al menos un clip y
hasta 32 clips.
Clip de concatenación
Campos obligatorios:
* type - una cadena con el valor concat
* durations - una matriz de enteros que representan duraciones MP4 en milisegundos,
esta matriz debe coincidir en cantidad y orden con la matriz paths.
Campos opcionales:
* paths - una matriz de cadenas, que contiene las rutas de los archivos MP4. Debe especificarse
ya sea paths o clipIds.
* clipIds - una matriz de cadenas, que contiene los ids de los clips fuente.
Los ids se traducen a rutas emitiendo una solicitud a la uri especificada en vod_source_clip_map_uri.
Debes especificarse ya sea paths o clipIds.
* tracks - una cadena que especifica las pistas que deben ser utilizadas, el valor predeterminado es "v1-a1",
lo que significa la primera pista de video y la primera pista de audio
* offset - un entero en milisegundos que indica el desplazamiento de marca de tiempo del
primer fotograma en el flujo concatenado en relación con el tiempo de inicio del clip
* basePath - una cadena que debe ser añadida como prefijo a todas las rutas
* notifications - matriz de objetos de notificación (ver más abajo), cuando se solicita un segmento,
todas las notificaciones que caen entre los tiempos de inicio/fin del segmento son activadas.
las notificaciones deben estar ordenadas en un orden de desplazamiento creciente.
Clip dinámico
Campos obligatorios:
* type - una cadena con el valor dynamic
* id - una cadena que identifica de manera única el clip dinámico, utilizada para mapear el clip a su contenido
Notificación
Campos obligatorios:
* offset - un entero en milisegundos que indica el tiempo en el que la notificación debe ser activada.
cuando el objeto de notificación está contenido en el conjunto de medios, offset es relativo a firstClipTime
(0 para vod). cuando el objeto de notificación está contenido en un clip de concatenación, offset es relativo a
el comienzo del clip de concatenación.
* id - una cadena que identifica la notificación, este id puede ser referenciado por vod_notification_uri
usando la variable $vod_notification_id
Subtítulos cerrados
Campos obligatorios:
* id - una cadena que identifica los subtítulos incrustados. Esto se convertirá en el campo INSTREAM-ID y debe
tener uno de los siguientes valores: CC1, CC3, CC3, CC4, o SERVICEn, donde n está entre 1 y 63.
* label - una cadena amigable que indica el idioma de la pista de subtítulos cerrados.
Campos opcionales:
* language - un código de idioma de 3 letras (ISO-639-2) que indica el idioma de la pista de subtítulos cerrados.
Seguridad
Encriptación de URL
Como alternativa a la tokenización, se puede utilizar la encriptación de URL para evitar que un atacante pueda crear una URL reproducible. La encriptación de URL puede ser implementada con https://github.com/kaltura/nginx-secure-token-module, y es soportada para HLS y DASH (con formato de manifiesto establecido en segmentlist).
En términos de seguridad, la principal ventaja de los tokens CDN sobre la encriptación de URL es que los tokens CDN generalmente expiran, mientras que las URLs encriptadas no (alguien que obtiene una URL reproducible podrá utilizarla indefinidamente)
Encriptación de medios
Nginx-vod-module soporta esquemas de encriptación HLS AES-128 y SAMPLE-AES. La principal diferencia entre la encriptación de medios y DRM (detallado a continuación) es el mecanismo utilizado para transferir la clave de encriptación al cliente. Con la encriptación de medios, la clave es obtenida por el cliente realizando una simple solicitud GET al nginx-vod-module, mientras que con DRM la clave es devuelta dentro de una respuesta de licencia específica del proveedor.
La encriptación de medios reduce el problema de asegurar los medios a la necesidad de asegurar la clave de encriptación. Las URLs de los segmentos de medios (que componen la gran mayoría del tráfico) pueden estar completamente desprotegidas, y fácilmente almacenables en caché por cualquier proxy entre el cliente y los servidores (a diferencia de la tokenización). La solicitud de clave de encriptación puede ser protegida utilizando uno de los métodos mencionados anteriormente (tokens CDN, reglas de acceso de nginx, etc.).
Además, es posible configurar nginx-vod-module para devolver la clave de encriptación a través de HTTPS
mientras se entregan los segmentos a través de HTTP. La forma de configurar esto es establecer vod_segments_base_url
en http://nginx-vod-host y establecer vod_base_url en https://nginx-vod-host.
DRM
Nginx-vod-module tiene la capacidad de realizar encriptación en tiempo real para MPEG DASH (CENC), MSS Play Ready y FairPlay HLS. Al igual que en el caso de la encriptación de medios, la encriptación se realiza mientras se sirve un segmento de video/audio al cliente, por lo tanto, cuando se trabaja con DRM se recomienda no servir el contenido directamente desde nginx-vod-module a los usuarios finales. Una arquitectura más escalable sería utilizar servidores proxy o un CDN para almacenar en caché los segmentos encriptados.
Para realizar la encriptación, nginx-vod-module necesita varios parámetros, incluyendo key & key_id, estos parámetros
se obtienen de un servidor externo a través de solicitudes HTTP GET.
El parámetro vod_drm_upstream_location especifica una ubicación de nginx que se utiliza para acceder al servidor DRM,
y la uri de solicitud se configura utilizando vod_drm_request_uri (este parámetro puede incluir variables).
La respuesta del servidor DRM es un JSON, con el siguiente formato:
[{
"pssh": [{
"data": "CAESEGMyZjg2MTczN2NjNGYzODIaB2thbHR1cmEiCjBfbmptaWlwbXAqBVNEX0hE",
"uuid": "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
}],
"key": "GzoNU9Dfwc//Iq3/zbzMUw==",
"key_id": "YzJmODYxNzM3Y2M0ZjM4Mg=="
}]
pssh.data- datos binarios codificados en base64, el formato de estos datos es específico del proveedor de drmpssh.uuid- el UUID del sistema drm, en este caso, edef8ba9-79d6-4ace-a3c8-27dcd51d21ed representa Widevinekey- clave de encriptación codificada en base64 (128 bits)key_id- identificador de clave codificado en base64 (128 bits)iv- vector de inicialización opcional codificado en base64 (128 bits). El IV se utiliza actualmente solo en HLS (FairPlay), en los otros protocolos un IV es generado automáticamente por nginx-vod-module.
Configuraciones de muestra
Apple FairPlay HLS:
location ~ ^/fpshls/p/\d+/(sp/\d+/)?serveFlavor/entryId/([^/]+)/(.*) {
vod hls;
vod_hls_encryption_method sample-aes;
vod_hls_encryption_key_uri "skd://entry-$2";
vod_hls_encryption_key_format "com.apple.streamingkeydelivery";
vod_hls_encryption_key_format_versions "1";
vod_drm_enabled on;
vod_drm_request_uri "/udrm/system/ovp/$vod_suburi";
vod_last_modified_types *;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
add_header Access-Control-Allow-Origin '*';
expires 100d;
}
Cifrado común HLS:
location ~ ^/cenchls/p/\d+/(sp/\d+/)?serveFlavor/entryId/([^/]+)/(.*) {
vod hls;
vod_hls_encryption_method sample-aes-cenc;
vod_hls_encryption_key_format "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed";
vod_hls_encryption_key_format_versions "1";
vod_drm_enabled on;
vod_drm_request_uri "/udrm/system/ovp/$vod_suburi";
vod_last_modified_types *;
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Expose-Headers 'Server,range,Content-Length,Content-Range';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
add_header Access-Control-Allow-Origin '*';
expires 100d;
}
Configuraciones verificadas
A continuación se presenta una lista de configuraciones que fueron probadas y encontradas funcionales: * DASH/CENC con PlayReady & Widevine PSSH juntos * MSS PlayReady * HLS FairPlay
Recomendaciones de rendimiento
-
Para implementaciones a mediana/grande escala, no hagas que los usuarios reproduzcan los videos directamente desde nginx-vod-module. Dado que todos los diferentes protocolos de transmisión soportados por nginx vod son basados en HTTP, pueden ser almacenados en caché por proxies HTTP estándar / CDNs. Para una escala mediana, añade una capa de proxies de caché entre el módulo vod y los usuarios finales (puede usar servidores nginx estándar con proxy_pass & proxy_cache). Para implementaciones a gran escala, se recomienda utilizar un CDN (como Akamai, Level3, etc.).
En general, es mejor tener nginx vod lo más cerca posible de donde se almacenan los archivos mp4, y tener los proxies de caché lo más cerca posible de los usuarios finales. 2. Habilita las cachés de nginx-vod-module: *
vod_metadata_cache- ahorra la necesidad de volver a leer los metadatos de video para cada segmento. Esta caché debe ser bastante grande, en el orden de GBs. *vod_response_cache- ahorra las respuestas de solicitudes de manifiesto. Esta caché puede no ser necesaria al usar una segunda capa de servidores de caché antes de nginx vod. No es necesario asignar un búfer grande para esta caché, 128M es probablemente más que suficiente para la mayoría de las implementaciones. *vod_mapping_cache- solo para modo mapeado, unos pocos MB suelen ser suficientes. * caché de archivos abiertos de nginx - almacena en caché los manejadores de archivos abiertos.Las tasas de aciertos/fallos de estas cachés pueden ser rastreadas habilitando contadores de rendimiento (
vod_performance_counters) y configurando una página de estado para nginx vod (vod_status) 3. En modos local y mapeado, habilita aio. - nginx debe ser compilado con soporte aio, y debe ser habilitado en la configuración de nginx (aio on). Puedes verificar que funciona observando los contadores de rendimiento en la página de estado de vod - read_file (aio off) vs. async_read_file (aio on) 4. En modos local y mapeado, habilita la apertura de archivos de manera asíncrona - nginx debe ser compilado con soporte de hilos, yvod_open_file_thread_pooldebe ser especificado en nginx.conf. Puedes verificar que funciona observando los contadores de rendimiento en la página de estado de vod - open_file vs. async_open_file. Ten en cuenta que open_file puede ser distinto de cero con vod_open_file_thread_pool habilitado, debido a la caché de archivos abiertos - solicitudes abiertas que se sirven desde la caché se contarán como open_file sincrónico. 5. Al usar DASH/MSS habilitado para DRM, si los archivos de video tienen un solo nalu por fotograma, establecevod_min_single_nalu_per_frame_segmenten un valor distinto de cero. 6. La sobrecarga de multiplexión de los flujos generados por este módulo puede ser reducida cambiando los siguientes parámetros: * HDS - establecevod_hds_generate_moof_atomen off * HLS - establecevod_hls_mpegts_align_framesen off yvod_hls_mpegts_interleave_framesen on 7. Habilita la compresión gzip en las respuestas de manifiesto -gzip_types application/vnd.apple.mpegurl video/f4m application/dash+xml text/xml8. Aplica las mejores prácticas comunes de rendimiento de nginx, como tcp_nodelay=on, client_header_timeout, etc.
Directivas de configuración - base
vod
- syntax:
vod segmenter - default:
n/a - context:
location
Habilita el módulo nginx-vod en la ubicación que lo envuelve.
Los valores permitidos para segmenter son:
none- sirve los archivos MP4 tal como están / recortadosdash- Empaquetador de Transmisión Adaptativa Dinámica sobre HTTPhds- Empaquetador de Transmisión Dinámica HTTP de Adobehls- Empaquetador de Transmisión en Vivo HTTP de Applemss- Empaquetador de Transmisión Suave de Microsoftthumb- captura de miniaturasvolume_map- mapa de volumen de audio
vod_mode
- syntax:
vod_mode mode - default:
local - context:
http,server,location
Establece el modo de acceso a archivos - local, remoto o mapeado (ver la sección de características anterior para más detalles)
vod_status
- syntax:
vod_status - default:
n/a - context:
location
Habilita la página de estado de nginx-vod en la ubicación que lo envuelve.
Los siguientes parámetros de consulta son soportados:
* ?reset=1 - reinicia los contadores de rendimiento y las estadísticas de caché.
* ?format=prom - devuelve la salida en un formato compatible con Prometheus (el formato predeterminado es XML).
Directivas de configuración - segmentación
vod_segment_duration
- syntax:
vod_segment_duration duration - default:
10s - context:
http,server,location
Establece la duración del segmento en milisegundos. Se recomienda encarecidamente utilizar una duración de segmento que sea un múltiplo de la duración GOP.
Si la duración del segmento no es un múltiplo de la duración GOP, y vod_align_segments_to_key_frames está habilitado, puede haber diferencias significativas
entre la duración del segmento que se informa en el manifiesto y la duración real del segmento. Esto también puede llevar a
la aparición de segmentos vacíos dentro del flujo.
vod_live_window_duration
- syntax:
vod_live_window_duration duration - default:
30000 - context:
http,server,location
Establece la duración total en milisegundos de los segmentos que deben ser devueltos en un manifiesto en vivo.
Si el valor es positivo, nginx vod devuelve un rango de un máximo de vod_live_window_duration milisegundos, terminando en el tiempo actual del servidor.
Si el valor es negativo, nginx vod devuelve un rango de un máximo de -vod_live_window_duration milisegundos desde el final del JSON de mapeo.
Si el valor se establece en cero, el manifiesto en vivo contendrá todos los segmentos que están completamente contenidos en el marco temporal del JSON de mapeo.
vod_force_playlist_type_vod
- syntax:
vod_force_playlist_type_vod on/off - default:
off - context:
http,server,location
Genera un flujo vod incluso cuando el conjunto de medios tiene playlistType=live.
Habilitar esta configuración tiene los siguientes efectos:
1. Las marcas de tiempo de los fotogramas serán continuas y comenzarán desde cero
2. Los índices de segmento comenzarán desde uno
3. En caso de HLS, el manifiesto devuelto tendrá tanto #EXT-X-PLAYLIST-TYPE:VOD como #EXT-X-ENDLIST
Esto puede ser útil para recortar secciones vod de una transmisión en vivo.
vod_force_continuous_timestamps
- syntax:
vod_force_continuous_timestamps on/off - default:
off - context:
http,server,location
Genera marcas de tiempo continuas incluso cuando el conjunto de medios tiene huecos (los huecos pueden ser creados por el uso de clipTimes)
Si las marcas de tiempo ID3 están habilitadas (vod_hls_mpegts_output_id3_timestamps), contienen las marcas de tiempo originales que se establecieron en clipTimes.
vod_bootstrap_segment_durations
- syntax:
vod_bootstrap_segment_durations duration - default:
none - context:
http,server,location
Agrega una duración de segmento de arranque en milisegundos. Esta configuración puede ser utilizada para hacer que los primeros segmentos sean más cortos que la duración de segmento predeterminada, haciendo que la selección de bitrate adaptativo se active antes sin la sobrecarga de segmentos cortos a lo largo del video.
vod_align_segments_to_key_frames
- syntax:
vod_align_segments_to_key_frames on/off - default:
off - context:
http,server,location
Cuando se habilita, el módulo obliga a que todos los segmentos comiencen con un fotograma clave. Habilitar esta configuración puede llevar a diferencias
entre las duraciones reales de los segmentos y las duraciones informadas en el manifiesto (a menos que vod_manifest_segment_durations_mode esté configurado en accurate).
vod_segment_count_policy
- syntax:
vod_segment_count_policy last_short/last_long/last_rounded - default:
last_short - context:
http,server,location
Configura la política para calcular el conteo de segmentos, para segment_duration = 10 segundos: * last_short - un archivo de 33 seg se particiona como - 10, 10, 10, 3 * last_long - un archivo de 33 seg se particiona como - 10, 10, 13 * last_rounded - un archivo de 33 seg se particiona como - 10, 10, 13, un archivo de 38 seg se particiona como 10, 10, 10, 8
vod_manifest_duration_policy
- syntax:
vod_manifest_duration_policy min/max - default:
max - context:
http,server,location
Configura la política para calcular la duración de un manifiesto que contiene múltiples flujos: * max - utiliza la duración máxima del flujo (predeterminado) * min - utiliza la duración mínima no cero del flujo
vod_manifest_segment_durations_mode
- syntax:
vod_manifest_segment_durations_mode estimate/accurate - default:
estimate - context:
http,server,location
Configura el modo de cálculo de las duraciones de los segmentos dentro de las solicitudes de manifiesto:
* estimate - informa la duración como se configuró en nginx.conf, e.g. si vod_segment_duration tiene el valor 10000,
un manifiesto HLS contendrá #EXTINF:10
* accurate - informa la duración exacta del segmento, teniendo en cuenta las duraciones de los fotogramas, e.g. para una
tasa de fotogramas de 29.97 y segmentos de 10 segundos, informará el primer segmento como 10.01. el modo preciso también
tiene en cuenta la alineación de fotogramas clave, en caso de que vod_align_segments_to_key_frames esté activado
vod_media_set_override_json
- syntax:
vod_media_set_override_json json - default:
{} - context:
http,server,location
Este parámetro proporciona una forma de anular porciones del JSON del conjunto de medios (solo modo mapeado).
Por ejemplo, vod_media_set_override_json '{"clipTo":20000}' recorta el conjunto de medios a 20 seg.
El valor del parámetro puede contener variables.
Directivas de configuración - upstream
vod_upstream_location
- syntax:
vod_upstream_location location - default:
none - context:
http,server,location
Establece una ubicación de nginx que se utiliza para leer el archivo MP4 (modo remoto) o mapear la URI de solicitud (modo mapeado).
vod_remote_upstream_location
- syntax:
vod_remote_upstream_location location - default:
none - context:
http,server,location
Establece una ubicación de nginx que se utiliza para leer el archivo MP4 en modo remoto o mapeado. Si esta directiva se establece en modo mapeado, el módulo lee los archivos MP4 a través de HTTP, tratando las rutas en el JSON de mapeo como URIs (el comportamiento predeterminado es leer de archivos locales)
vod_max_upstream_headers_size
- syntax:
vod_max_upstream_headers_size size - default:
4k - context:
http,server,location
Establece el tamaño que se asigna para mantener los encabezados de respuesta al emitir solicitudes upstream (a vod_xxx_upstream_location).
vod_upstream_extra_args
- syntax:
vod_upstream_extra_args "arg1=value1&arg2=value2&..." - default:
empty - context:
http,server,location
Argumentos de cadena de consulta adicionales que deben ser añadidos a la solicitud upstream (solo modos remoto/mapeado). El valor del parámetro puede contener variables.
vod_media_set_map_uri
- syntax:
vod_media_set_map_uri uri - default:
$vod_suburi - context:
http,server,location
Establece la uri de las solicitudes de mapeo del conjunto de medios, el valor del parámetro puede contener variables.
En caso de múltiples URL, $vod_suburi será la sub uri actual (se emite una solicitud separada por cada sub URL)
vod_path_response_prefix
- syntax:
vod_path_response_prefix prefix - default:
{"sequences":[{"clips":[{"type":"source","path":" - context:
http,server,location
Establece el prefijo que se espera en las respuestas de mapeo de URI (solo modo mapeado).
vod_path_response_postfix
- syntax:
vod_path_response_postfix postfix - default:
"}]}]} - context:
http,server,location
Establece el sufijo que se espera en las respuestas de mapeo de URI (solo modo mapeado).
vod_max_mapping_response_size
- syntax:
vod_max_mapping_response_size length - default:
1K - context:
http,server,location
Establece la longitud máxima de una ruta devuelta desde upstream (solo modo mapeado).
Directivas de configuración - fallback
vod_fallback_upstream_location
- syntax:
vod_fallback_upstream_location location - default:
none - context:
http,server,location
Establece una ubicación de nginx a la que se reenvía la solicitud después de encontrar un error de archivo no encontrado (modos local/mapeado).
vod_proxy_header_name
- syntax:
vod_proxy_header_name name - default:
X-Kaltura-Proxy - context:
http,server,location
Establece el nombre de un encabezado HTTP que se utiliza para prevenir bucles de proxy de respaldo (modos local/mapeado).
vod_proxy_header_value
- syntax:
vod_proxy_header_value name - default:
dumpApiRequest - context:
http,server,location
Establece el valor de un encabezado HTTP que se utiliza para prevenir bucles de proxy de respaldo (modos local/mapeado).
Directivas de configuración - rendimiento
vod_metadata_cache
- syntax:
vod_metadata_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Configura el tamaño y el nombre del objeto de memoria compartida de la caché de metadatos de video. Para archivos MP4, esta caché contiene el átomo moov.
vod_mapping_cache
- syntax:
vod_mapping_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Configura el tamaño y el nombre del objeto de memoria compartida de la caché de mapeo para vod (solo modo mapeado).
vod_live_mapping_cache
- syntax:
vod_live_mapping_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Configura el tamaño y el nombre del objeto de memoria compartida de la caché de mapeo para en vivo (solo modo mapeado).
vod_response_cache
- syntax:
vod_response_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Configura el tamaño y el nombre del objeto de memoria compartida de la caché de respuesta. La caché de respuesta contiene manifiestos y otro contenido no de video (como el segmento de inicialización de DASH, la clave de encriptación de HLS, etc.). Los segmentos de video no se almacenan en caché.
vod_live_response_cache
- syntax:
vod_live_response_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Configura el tamaño y el nombre del objeto de memoria compartida de la caché de respuesta para respuestas en vivo que cambian con el tiempo. Esta caché contiene los siguientes tipos de respuestas para en vivo: DASH MPD, HLS índice M3U8, HDS arranque, manifiesto MSS.
vod_initial_read_size
- syntax:
vod_initial_read_size size - default:
4K - context:
http,server,location
Establece el tamaño de la operación de lectura inicial del archivo MP4.
vod_max_metadata_size
- syntax:
vod_max_metadata_size size - default:
128MB - context:
http,server,location
Establece el tamaño máximo de metadatos de video soportado (para MP4 - tamaño del átomo moov)
vod_max_frames_size
- syntax:
vod_max_frames_size size - default:
16MB - context:
http,server,location
Establece el límite en el tamaño total de los fotogramas de un solo segmento
vod_max_frame_count
- syntax:
vod_max_frame_count count - default:
1048576 - context:
http,server,location
Establece el límite en el conteo total de los fotogramas leídos para atender solicitudes no de segmento (e.g. lista de reproducción).
vod_segment_max_frame_count
- syntax:
vod_segment_max_frame_count count - default:
65536 - context:
http,server,location
Establece el límite en el conteo total de los fotogramas leídos para atender solicitudes de segmento.
vod_cache_buffer_size
- syntax:
vod_cache_buffer_size size - default:
256K - context:
http,server,location
Establece el tamaño de los búferes de caché utilizados al leer fotogramas MP4.
vod_open_file_thread_pool
- syntax:
vod_open_file_thread_pool pool_name - default:
off - context:
http,server,location
Habilita el uso de apertura de archivos asíncrona a través de un grupo de hilos. El grupo de hilos debe ser definido con una directiva thread_pool, si no se especifica ningún nombre de grupo se utiliza el grupo predeterminado. Esta directiva es soportada solo en nginx 1.7.11 o más reciente al compilar con --add-threads. Nota: esta directiva actualmente desactiva el uso de la caché de archivos abiertos de nginx por parte de nginx-vod-module
vod_output_buffer_pool
- syntax:
vod_output_buffer_pool size count - default:
off - context:
http,server,location
Pre-asigna búferes para generar datos de respuesta, ahorrando la necesidad de asignar/liberar los búferes en cada solicitud.
vod_performance_counters
- syntax:
vod_performance_counters zone_name - default:
off - context:
http,server,location
Configura el nombre del objeto de memoria compartida de los contadores de rendimiento
Directivas de configuración - estructura de URL
vod_base_url
- syntax:
vod_base_url url - default:
ver abajo - context:
http,server,location
Establece la URL base (esquema + dominio) que debe ser devuelta en las respuestas de manifiesto.
El valor del parámetro puede contener variables, si el parámetro evalúa a una cadena vacía, se utilizarán URLs relativas.
Si el parámetro evalúa a una cadena que termina en /, se asume que es una URL completa - el módulo solo añade el
nombre del archivo a ella, en lugar de una URI completa.
Si no se establece, la URL base se determina de la siguiente manera:
1. Si la solicitud no contenía un encabezado de host (HTTP/1.0) se devolverán URLs relativas
2. De lo contrario, la URL base será $scheme://$http_host
La configuración actualmente afecta solo a HLS y DASH. En MSS y HDS, siempre se devuelven URLs relativas.
vod_segments_base_url
- syntax:
vod_segments_base_url url - default:
ver abajo - context:
http,server,location
Establece la URL base (esquema + dominio) que debe ser utilizada para entregar segmentos de video. El valor del parámetro puede contener variables, si el parámetro evalúa a una cadena vacía, se utilizarán URLs relativas. Si no se establece, se utilizará vod_base_url. La configuración actualmente afecta solo a HLS.
vod_multi_uri_suffix
- syntax:
vod_multi_uri_suffix suffix - default:
.urlset - context:
http,server,location
Un sufijo de URL que se utiliza para identificar múltiples URLs. Una URL múltiple es una forma de codificar varias URLs diferentes que deben ser reproducidas juntas como un conjunto de transmisión adaptativa, bajo una sola URL. Cuando se utiliza el sufijo predeterminado, una URL de conjunto HLS puede verse así: http://host/hls/common-prefix,bitrate1,bitrate2,common-suffix.urlset/master.m3u8
vod_clip_to_param_name
- syntax:
vod_clip_to_param_name name - default:
clipTo - context:
http,server,location
El nombre del parámetro de solicitud de clip a.
vod_clip_from_param_name
- syntax:
vod_clip_from_param_name name - default:
clipFrom - context:
http,server,location
El nombre del parámetro de solicitud de clip desde.
vod_tracks_param_name
- syntax:
vod_tracks_param_name name - default:
tracks - context:
http,server,location
El nombre del parámetro de solicitud de pistas.
vod_time_shift_param_name
- syntax:
vod_time_shift_param_name name - default:
shift - context:
http,server,location
El nombre del parámetro de solicitud de desplazamiento.
vod_speed_param_name
- syntax:
vod_speed_param_name name - default:
speed - context:
http,server,location
El nombre del parámetro de solicitud de velocidad.
vod_lang_param_name
- syntax:
vod_lang_param_name name - default:
lang - context:
http,server,location
El nombre del parámetro de solicitud de idioma.
vod_force_sequence_index
- syntax:
vod_force_sequence_index on/off - default:
off - context:
http,server,location
Usar el índice de secuencia en las URIs de segmento incluso si solo hay una secuencia
Directivas de configuración - encabezados de respuesta
vod_expires
- syntax:
vod_expires time - default:
none - context:
http,server,location
Establece el valor de los encabezados de respuesta "Expires" y "Cache-Control" para solicitudes exitosas.
Esta directiva es similar a la directiva incorporada expires de nginx, excepto que solo soporta el escenario de intervalo de expiración
(epoch, max, off, tiempo de día no son soportados)
La principal motivación para usar esta directiva en lugar de la expires incorporada es tener diferentes expiraciones para contenido VOD y dinámico en vivo.
Si esta directiva no se especifica, nginx-vod-module no establecerá los encabezados "Expires" / "Cache-Control".
Esta configuración afecta a todos los tipos de solicitudes en listas de reproducción VOD y solicitudes de segmentos en listas de reproducción en vivo.
vod_expires_live
- syntax:
vod_expires_live time - default:
none - context:
http,server,location
Igual que vod_expires (arriba) para solicitudes en vivo que no son dependientes del tiempo y no son segmentos (e.g. HLS - master.m3u8, HDS - manifest.f4m).
vod_expires_live_time_dependent
- syntax:
vod_expires_live_time_dependent time - default:
none - context:
http,server,location
Igual que vod_expires (arriba) para solicitudes en vivo que son dependientes del tiempo (HLS - index.m3u8, HDS - bootstrap.abst, MSS - manifest, DASH - manifest.mpd).
vod_last_modified
- syntax:
vod_last_modified time - default:
none - context:
http,server,location
Establece el valor del encabezado Last-Modified devuelto en la respuesta, por defecto el módulo no devuelve un encabezado Last-Modified. La razón para tener este parámetro aquí es para soportar If-Modified-Since / If-Unmodified-Since. Dado que el módulo incorporado ngx_http_not_modified_filter_module de nginx se ejecuta antes de cualquier otro módulo de filtro de encabezados, no verá ningún encabezado establecido por add_headers / more_set_headers. Esto hace que nginx siempre responda como si el contenido hubiera cambiado (412 para If-Unmodified-Since / 200 para If-Modified-Since) Para solicitudes en vivo que no son segmentos (e.g. live DASH MPD), Last-Modified se establece en el tiempo actual del servidor.
vod_last_modified_types
- syntax:
vod_last_modified_types mime-type1 mime-type2 ... - default:
none - context:
http,server,location
Establece los tipos MIME para los cuales se debe establecer el encabezado Last-Modified. El valor especial "*" coincide con cualquier tipo MIME.
Directivas de configuración - costura de anuncios (solo modo mapeado)
vod_dynamic_mapping_cache
- syntax:
vod_dynamic_mapping_cache zone_name zone_size [expiration] - default:
off - context:
http,server,location
Configura el tamaño y el nombre del objeto de memoria compartida de la caché que almacena el mapeo de clips dinámicos.
vod_dynamic_clip_map_uri
- syntax:
vod_dynamic_clip_map_uri uri - default:
none - context:
http,server,location
Establece la uri que debe ser utilizada para mapear clips dinámicos.
El valor del parámetro puede contener variables, específicamente, $vod_clip_id contiene el id del clip que debe ser mapeado.
La respuesta esperada de esta uri es un JSON que contiene un objeto de clip de concatenación.
vod_source_clip_map_uri
- syntax:
vod_source_clip_map_uri uri - default:
none - context:
http,server,location
Establece la uri que debe ser utilizada para mapear clips fuente definidos utilizando la propiedad clipIds de concatenación.
El valor del parámetro puede contener variables, específicamente, $vod_clip_id contiene el id del clip que debe ser mapeado.
La respuesta esperada de esta uri es un JSON que contiene un objeto de clip fuente.
vod_redirect_segments_url
- syntax:
vod_redirect_segments_url url - default:
none - context:
http,server,location
Establece una url a la que deben ser redirigidas las solicitudes de segmentos.
El valor del parámetro puede contener variables, específicamente, $vod_dynamic_mapping contiene una representación serializada del mapeo de clips dinámicos.
vod_apply_dynamic_mapping
- syntax:
vod_apply_dynamic_mapping mapping - default:
none - context:
http,server,location
Mapea clips dinámicos a clips de concatenación utilizando la expresión dada, previamente generada por $vod_dynamic_mapping.
El valor del parámetro puede contener variables.
vod_notification_uri
- syntax:
vod_notification_uri uri - default:
none - context:
http,server,location
Establece la uri que debe