Ir al contenido

Crear un Stream de Respaldo desde una Imagen

Un stream de video de respaldo a partir de una imagen estática sirve como alternativa cuando tu fuente principal falla. La imagen puede mostrar un mensaje como “Dificultades técnicas, por favor espere” u otra información de servicio. Este método también es útil para Sistemas de Alerta de Emergencia (EAS) para transmitir advertencias visuales.

La codificación de video consume muchos recursos. Para reducir el uso de CPU, es mejor pre-codificar la imagen en archivos de video cortos en vez de codificar en tiempo real.

Para cambiar entre la fuente principal y la de respaldo sin problemas, el códec de video debe coincidir con el de tu stream principal. Crea archivos de video para cada formato de códec que utilices (H.264, HEVC, etc.).

Usa ffprobe para analizar tu stream principal:

Ventana de terminal
ffprobe -hide_banner -v error -show_streams -show_format udp://239.255.1.1:1234

Busca estos parámetros importantes en la salida:

  • codec_name — códec de video: h264, hevc o mpeg2video
  • width y height — resolución de video, por ejemplo 1920 y 1080
  • r_frame_rate — tasa de cuadros, por ejemplo 25/1 significa 25 fps
  • pix_fmt — formato de píxel, normalmente yuv420p
  • profile — perfil del códec, por ejemplo high para H.264
  • level — nivel del códec, por ejemplo 40 significa nivel 4.0

Para un cambio fluido entre la fuente principal y la de respaldo, tu video de respaldo debe coincidir en:

  • Códec de video
  • Tasa de cuadros
  • Resolución
  • Formato de píxel

Usa ffmpeg para convertir una imagen estática en un archivo de video que se pueda repetir en bucle. Ajusta los parámetros según el análisis de tu stream principal:

Ventana de terminal
ffmpeg -loop 1 -i image.png -c:v libx264 -profile:v high -level 40 -s 1920x1080 -r 25 -pix_fmt yuv420p -t 10 /opt/ts/backup-h264.ts

Opciones explicadas:

  • -loop 1 — repite la imagen de entrada
  • -i image.png — archivo de imagen de entrada (PNG, JPEG u otro formato)
  • -c:v libx264 — códec de video (usa libx265 para HEVC, mpeg2video para MPEG-2)
  • -profile:v high — perfil del códec (igual que profile de ffprobe)
  • -level 40 — nivel del códec (igual que level de ffprobe)
  • -s 1920x1080 — resolución (igual que width y height de ffprobe)
  • -r 25 — tasa de cuadros (igual que r_frame_rate de ffprobe)
  • -pix_fmt yuv420p — formato de píxel (igual que pix_fmt de ffprobe)
  • -t 10 — duración en segundos
  • /opt/ts/backup-h264.ts — archivo de salida en formato MPEG-TS

Para streams HEVC, cambia el codificador:

Ventana de terminal
ffmpeg -loop 1 -i image.png -c:v libx265 -s 1920x1080 -r 25 -pix_fmt yuv420p -t 10 /opt/ts/backup-hevc.ts

Para streams MPEG-2:

Ventana de terminal
ffmpeg -loop 1 -i image.png -c:v mpeg2video -b:v 5M -s 1920x1080 -r 25 -pix_fmt yuv420p -t 10 /opt/ts/backup-mpeg2.ts

Ejecuta FFmpeg para repetir el archivo de video y enviarlo como un stream UDP:

Ventana de terminal
ffmpeg -stream_loop -1 -re -i /opt/ts/backup-h264.ts -c copy -f mpegts 'udp://127.0.0.1:15001?pkt_size=1316'

Opciones explicadas:

  • -stream_loop -1 — repite el archivo infinitamente
  • -re — lee la entrada a la velocidad de cuadros original
  • -i /opt/ts/backup-h264.ts — archivo de video de entrada
  • -c copy — copia los streams sin recodificar
  • -f mpegts — formato de salida
  • pkt_size=1316 — tamaño de paquete UDP para MPEG-TS

Para que FFmpeg funcione de forma continua, configúralo como un servicio systemd.

Crea el archivo /etc/systemd/system/backup-h264.service con el siguiente contenido:

[Unit]
Description=Backup Video Stream from Image
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/ffmpeg \
-hide_banner -loglevel warning -nostats \
-stream_loop -1 \
-re \
-i /opt/ts/backup-h264.ts \
-c copy \
-f mpegts 'udp://127.0.0.1:15001?pkt_size=1316'
Restart=always
RestartSec=5
StandardOutput=null
StandardError=journal
[Install]
WantedBy=multi-user.target

Reemplaza en este archivo:

  • File Name: usa un nombre relevante en vez de backup-h264.service si tienes varios streams de respaldo
  • Description: cámbialo para que describa tu caso de uso
  • Input File: reemplaza /opt/ts/backup-h264.ts por la ruta real de tu archivo de video
  • UDP Port: cambia 15001 por el puerto UDP que quieras usar. Si tienes varios streams de respaldo, usa puertos diferentes.

Después de crear el archivo de servicio, habilítalo e inícialo:

Ventana de terminal
systemctl enable backup-h264
systemctl start backup-h264

En la configuración del canal, añade una segunda fuente de entrada con la dirección UDP:

udp://127.0.0.1:15001

Astra cambiará automáticamente a este stream de respaldo cuando la fuente principal falle.