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

El comando anterior envía un stream solo de video. Añade el sonido al emitir el archivo, no al crearlo. Por ejemplo, un cliente puede hacer un canal con una imagen y una radio.

En este ejemplo, la fuente de audio es udp://127.0.0.1:14001. Para recibir una radio de internet y enviarla por UDP, lee Recibiendo Transmisiones de Radio.

Usa este comando en lugar del anterior:

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

Opciones explicadas:

  • -i 'udp://127.0.0.1:14001' — fuente de audio, por ejemplo un stream de radio. Usa un puerto distinto al de salida
  • -map 0:v:0 — toma el video del archivo de imagen
  • -map 1:a:0 — toma el primer stream de audio de la fuente de audio
  • -c copy — copia el video y el audio sin recodificar

Las demás opciones son las mismas que en el comando anterior.

La dirección de salida sigue siendo udp://127.0.0.1:15001, así que la configuración de Astra de más abajo no cambia.

Para que FFmpeg siga en marcha, usa el servicio de más abajo y añade la entrada de audio y las opciones -map a ExecStart.

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.