Conmutación de fuentes¶
media.source.failover
Un stream puede tener varias fuentes. Sapsan vigila la fuente activa, conmuta automáticamente a la siguiente cuando esta se degrada y vuelve a la principal cuando se recupera. Esta lógica se llama LSI (Live Source Input).
Varias entradas¶
Las entradas se enumeran en orden de prioridad — la primera es la principal:
streams:
- name: tv1
inputs:
- udp:
host: 239.0.0.1
port: 5000
- tshttp:
url: http://backup-origin.example.com/tv1/mpegts
Cómo funciona la conmutación¶
Propiedades clave del algoritmo, importantes para el aire:
- Una fuente se vuelve activa solo cuando está lista: debe entregar los parámetros del stream (MediaInfo) y un punto inicial adecuado (fotograma clave, cuadro de audio o límite de fragmento). Hasta entonces los espectadores siguen recibiendo la fuente actual.
- Retorno tras una ventana limpia: una entrada recuperada de mayor prioridad se comprueba en segundo plano. Para entradas que abre Sapsan, debe alcanzar un punto inicial adecuado y pasar
return_alive_secssin infringir reglas antes de conmutar. - Una entrada caída se reconecta con demoras crecientes (
reconnect_initial_delay→reconnect_delay_step→reconnect_max_delay); cuando se agotan todas las entradas, la rotación vuelve a empezar desde la primera. - Una fuente cuyo bitrate supera
max_bitratese detiene forzosamente. - Tiempos de espera separados para la ausencia de vídeo y de audio: el audio perdido con vídeo vivo también cuenta como degradación.
Política de conmutación¶
La sección lsi fija la política para todo el stream. source_options permite redefinir los tiempos de espera, límites de bitrate y ventana limpia de una entrada; las demoras de reconexión y el intervalo de comprobación en segundo plano se definen solo en lsi:
streams:
- name: tv1
inputs:
- udp: {host: 239.0.0.1, port: 5000}
- udp:
host: 239.0.0.2
port: 5000
source_options:
source_timeout: 10
lsi:
source_timeout: 5
video_timeout: 3
audio_timeout: 3
Los tiempos de espera y el intervalo de comprobación se expresan en segundos; las demoras de reconexión, en milisegundos. Parámetros principales:
| Parámetro | Descripción |
|---|---|
source_timeout, video_timeout, audio_timeout |
tiempos de espera por ausencia de datos/vídeo/audio |
max_bitrate |
límite de bitrate de la fuente |
reconnect_initial_delay, reconnect_delay_step, reconnect_max_delay |
política de reconexión (solo lsi), milisegundos |
recheck_secondary_inputs_interval |
intervalo de comprobación de entradas inactivas (solo lsi), segundos |
allow_if, deny_if (solo en source_options) |
habilitar/deshabilitar una entrada mediante un archivo de bandera externo |
allow_if/deny_if permiten controlar las entradas desde fuera sin editar la configuración: una entrada se usa solo mientras el archivo de bandera lo permite.
Estado de la fuente secundaria¶
Aplique la configuración mediante central. Defina explícitamente el intervalo de comprobación en segundo plano en lsi; este ejemplo comprueba las entradas inactivas con un intervalo de 10 segundos:
streams:
- name: tv1
inputs:
- udp: {host: 239.0.0.1, port: 5000}
- udp: {host: 239.0.0.2, port: 5000}
lsi:
source_timeout: 5
recheck_secondary_inputs_interval: 10
Lea el estado mediante la API de gestión de central. Con dos entradas configuradas, inputs[1] es la segunda fuente y current indica si alimenta el stream ahora:
curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
http://central:8080/central/api-v4/streams/stats/tv1 \
| jq '{active: [.inputs[] | select(.current)], secondary: .inputs[1] | {url, current, status, problems, checked_at, error, failure_cause}}'
status es el último estado observado, no una garantía de conmutación sin cortes. checked_at contiene la hora de observación RFC 3339 UTC; si falta, todavía no hubo comprobación. Valores:
working— llegan frames, ventana limpia sin infracciones.starting— entrada abierta, todavía sin frames.degraded— llegan frames, se infringe una regla de calidad.dead— sin frames por error o timeout.unchecked— entrada todavía no observada.
Consulte problems, error y failure_cause para conocer la causa. current: false no significa por sí solo un fallo: una reserva sana no está seleccionada para emisión. Compruebe la antigüedad de checked_at y compare media_info de ambas entradas: códecs o geometrías distintos no permiten asumir una conmutación sin cortes.
Tiempo en las entradas primaria y de reserva¶
Lea la sección detallada input directamente del streamer que captura tv1. Central entrega el estado actual compacto y no solicita esta sección al streamer:
curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
http://streamer:8080/streamer/api-v4/streams/stats/tv1 \
| jq '.input | {primary_s: (.num_sec_on_primary_input // 0), secondary_s: (.num_sec_on_secondary_input // 0), no_data_s: (.num_sec_no_data // 0), switches: (.input_switches // 0), retries: (.retries // 0)}'
Estos valores acumulativos usan ticks de un segundo durante la vida de las estadísticas del stream. num_sec_on_secondary_input suma todas las entradas posteriores a la primera, no solo la segunda. num_sec_no_data cuenta los segundos después del timeout sin datos. Los campos a cero pueden omitirse; use // 0 solo dentro de una sección input realmente recibida. Si falta la sección, no significa tiempo cero.
Ejemplo de dos muestras:
{"t0":{"primary_s":3600,"secondary_s":120,"no_data_s":0},
"t1":{"primary_s":3640,"secondary_s":140,"no_data_s":0}}
Durante el intervalo, la primaria se usó 40 s y las reservas 20 s; la proporción de reserva del tiempo con datos es 20 / (40 + 20) = 33.3%. Reste muestras consecutivas. Si los contadores disminuyen tras un reinicio o reasignación del stream, inicie un nuevo intervalo; no sume diferencias negativas.