Перейти к содержимому

Создание резервного потока из изображения

Резервный видеопоток из статического изображения обеспечивает подстраховку на случай сбоя основного источника. На изображении можно разместить сообщение вроде «Технические неполадки, пожалуйста, подождите» или другую служебную информацию. Такой подход также полезен для систем экстренного оповещения (EAS) для передачи визуальных предупреждений.

Видеокодирование — ресурсоёмкая задача. Чтобы снизить нагрузку на процессор, заранее закодируйте изображение в короткие видеофайлы, а не кодируйте в реальном времени.

Для плавного переключения между основным и резервным источником видеокодек должен совпадать с основным потоком. Создайте видеофайлы для каждого используемого формата кодека (H.264, HEVC и т.д.).

Используйте ffprobe для анализа основного потока:

Окно терминала
ffprobe -hide_banner -v error -show_streams -show_format udp://239.255.1.1:1234

В выводе обратите внимание на следующие параметры:

  • codec_name — видеокодек: h264, hevc или mpeg2video
  • width и height — разрешение видео, например 1920 и 1080
  • r_frame_rate — частота кадров, например 25/1 означает 25 кадров/с
  • pix_fmt — формат пикселей, обычно yuv420p
  • profile — профиль кодека, например high для H.264
  • level — уровень кодека, например 40 означает уровень 4.0

Для плавного переключения между основным и резервным источником резервное видео должно совпадать по:

  • Видеокодеку
  • Частоте кадров
  • Разрешению
  • Формату пикселей

Используйте ffmpeg, чтобы преобразовать статическое изображение в зацикленный видеофайл. Установите параметры на основе анализа основного потока:

Окно терминала
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

Пояснения к опциям:

  • -loop 1 — зацикливает входное изображение
  • -i image.png — входной файл изображения (PNG, JPEG или другой формат)
  • -c:v libx264 — видеокодек (используйте libx265 для HEVC, mpeg2video для MPEG-2)
  • -profile:v high — профиль кодека (совпадает с profile из ffprobe)
  • -level 40 — уровень кодека (совпадает с level из ffprobe)
  • -s 1920x1080 — разрешение (совпадает с width и height из ffprobe)
  • -r 25 — частота кадров (совпадает с r_frame_rate из ffprobe)
  • -pix_fmt yuv420p — формат пикселей (совпадает с pix_fmt из ffprobe)
  • -t 10 — длительность в секундах
  • /opt/ts/backup-h264.ts — выходной файл в формате MPEG-TS

Для потоков HEVC смените кодировщик:

Окно терминала
ffmpeg -loop 1 -i image.png -c:v libx265 -s 1920x1080 -r 25 -pix_fmt yuv420p -t 10 /opt/ts/backup-hevc.ts

Для потоков MPEG-2:

Окно терминала
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

Запустите FFmpeg для зацикливания видеофайла и передачи его как UDP-потока:

Окно терминала
ffmpeg -stream_loop -1 -re -i /opt/ts/backup-h264.ts -c copy -f mpegts 'udp://127.0.0.1:15001?pkt_size=1316'

Пояснения к опциям:

  • -stream_loop -1 — бесконечно зацикливает файл
  • -re — воспроизводит входной файл с исходной скоростью кадров
  • -i /opt/ts/backup-h264.ts — входной видеофайл
  • -c copy — копирует потоки без перекодирования
  • -f mpegts — выходной формат
  • pkt_size=1316 — размер UDP-пакета для MPEG-TS

Чтобы FFmpeg работал непрерывно, настройте его как сервис systemd.

Создайте файл /etc/systemd/system/backup-h264.service со следующим содержимым:

[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

В этом файле замените:

  • File Name: используйте подходящее имя вместо backup-h264.service, если у вас несколько резервных потоков
  • Description: измените описание под ваш случай
  • Input File: укажите путь к вашему видеофайлу вместо /opt/ts/backup-h264.ts
  • UDP Port: замените 15001 на нужный UDP-порт. Для нескольких резервных потоков используйте разные порты.

После создания файла сервиса включите и запустите сервис:

Окно терминала
systemctl enable backup-h264
systemctl start backup-h264

В настройках канала добавьте второй источник с UDP-адресом:

udp://127.0.0.1:15001

Astra автоматически переключится на этот резервный поток при сбое основного источника.