Pular para o conteúdo

Criando um stream de backup a partir de uma imagem

Um stream de vídeo de backup feito a partir de uma imagem estática serve como alternativa quando a sua fonte principal falha. A imagem pode mostrar uma mensagem como “Problemas técnicos, aguarde” ou outra informação de serviço. Essa abordagem também é útil para sistemas de alerta de emergência (EAS), para transmitir avisos visuais.

A codificação de vídeo consome muitos recursos. Para reduzir o uso de CPU, codifique a imagem em arquivos de vídeo curtos com antecedência, em vez de codificar em tempo real.

Para uma troca suave entre a fonte principal e a de backup, o codec de vídeo precisa ser igual ao do seu stream principal. Crie arquivos de vídeo para cada formato de codec que você usa (H.264, HEVC, etc.).

Use o ffprobe para analisar o seu stream principal:

Terminal window
ffprobe -hide_banner -v error -show_streams -show_format udp://239.255.1.1:1234

Procure estes parâmetros importantes na saída:

  • codec_name - codec de vídeo: h264, hevc ou mpeg2video
  • width e height - resolução do vídeo, por exemplo 1920 e 1080
  • r_frame_rate - taxa de quadros, por exemplo 25/1 significa 25 fps
  • pix_fmt - formato de pixel, normalmente yuv420p
  • profile - perfil do codec, por exemplo high para H.264
  • level - nível do codec, por exemplo 40 significa nível 4.0

Para uma troca suave entre a fonte principal e a de backup, o seu vídeo de backup precisa ter os mesmos:

  • Codec de vídeo
  • Taxa de quadros
  • Resolução
  • Formato de pixel

Use o ffmpeg para converter uma imagem estática em um arquivo de vídeo que possa rodar em loop. Defina os parâmetros com base na análise do seu stream principal:

Terminal window
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

Opções explicadas:

  • -loop 1 - repete a imagem de entrada em loop
  • -i image.png - arquivo de imagem de entrada (PNG, JPEG ou outro formato)
  • -c:v libx264 - codec de vídeo (use libx265 para HEVC, mpeg2video para MPEG-2)
  • -profile:v high - perfil do codec (igual ao profile do ffprobe)
  • -level 40 - nível do codec (igual ao level do ffprobe)
  • -s 1920x1080 - resolução (igual a width e height do ffprobe)
  • -r 25 - taxa de quadros (igual ao r_frame_rate do ffprobe)
  • -pix_fmt yuv420p - formato de pixel (igual ao pix_fmt do ffprobe)
  • -t 10 - duração em segundos
  • /opt/ts/backup-h264.ts - arquivo de saída no formato MPEG-TS

Para streams HEVC, troque o codificador:

Terminal window
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:

Terminal window
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

Execute o FFmpeg para rodar o arquivo de vídeo em loop e enviá-lo como um stream UDP:

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

Opções explicadas:

  • -stream_loop -1 - repete o arquivo em loop infinito
  • -re - lê a entrada na taxa de quadros nativa
  • -i /opt/ts/backup-h264.ts - arquivo de vídeo de entrada
  • -c copy - copia os streams sem recodificar
  • -f mpegts - formato de saída
  • pkt_size=1316 - tamanho do pacote UDP para MPEG-TS

Para manter o FFmpeg rodando o tempo todo, configure ele como um serviço do systemd.

Crie o arquivo /etc/systemd/system/backup-h264.service com o seguinte conteúdo:

[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

Substitua neste arquivo:

  • Nome do arquivo: use um nome adequado no lugar de backup-h264.service se você tiver vários streams de backup
  • Description: mude para descrever o seu caso de uso
  • Arquivo de entrada: troque /opt/ts/backup-h264.ts pelo caminho real do seu arquivo de vídeo
  • Porta UDP: troque 15001 pela porta UDP que você quer usar. Se você tiver vários streams de backup, use portas diferentes.

Depois de criar o arquivo do serviço, ative e inicie o serviço:

Terminal window
systemctl enable backup-h264
systemctl start backup-h264

Nas configurações do canal, adicione uma segunda fonte de entrada com o endereço UDP:

udp://127.0.0.1:15001

O Astra vai trocar automaticamente para esse stream de backup quando a fonte principal falhar.