Есть две команды gstreamer, которые позволяют проксировать rtsp-поток:
Проксирует картинку и звук:
gst-launch-1.0 --gst-debug-level=3 rtspsrc protocols=tcp latency=50 location=<source url (обязательно с авторизацией)> name=rtsp ! rtph264depay ! h264parse ! rtspclientsink latency=50 location=rtsp://<host_ip>:<rtsp-simple-server's rtsp port>/<что-то (к примеру последний октет камеры)> name=rez rtsp. ! decodebin ! audioconvert ! voaacenc ! rez.
Шаблон:
gst-launch-1.0 --gst-debug-level=3 rtspsrc protocols=tcp latency=50 location=rtsp://admin:Supervisor@... name=rtsp ! rtph264depay ! h264parse ! rtspclientsink latency=50 location=rtsp://… name=rez rtsp. ! decodebin ! audioconvert ! voaacenc ! rez.
Проксирует только картинку:
gst-launch-1.0 --gst-debug-level=3 rtspsrc protocols=tcp latency=50 location=<source rtsp url (обязательно с авторизацией)> ! rtph264depay ! h264parse ! rtspclientsink latency=50 location=rtsp://<host_ip>:<rtsp-simple-server's rtsp port>/<что-то (к примеру последний октет камеры)>
Шаблон:
gst-launch-1.0 --gst-debug-level=3 rtspsrc protocols=tcp latency=50 location=rtsp://admin:Supervisor@... name=rtsp ! rtph264depay ! h264parse ! rtspclientsink latency=50 location=rtsp://…
Важно: плагин rtspclientsink не умеет открывать себе порт, поэтому мы будем использовать rtsp-simple-server, как открыватель. На этот порт можно повесить сколько угодно инстансов gstreamer.
Расскажу, как запустить их в systemd.
Последовательность действий:
Делаем все по существующей инструкции, но с оговорками:
RuntimeMaxSec
Используем команду с оф. сайта, но с изменениями:
gstreamer1.0-doc
gstreamer1.0-rtsp
Пример конфига:
[Unit]
Wants=network.target
[Service]
ExecStartPre=/bin/bash -c "/bin/systemctl set-environment ip=$(hostname -I | awk '{print $1}')"
ExecStart=gst-launch-1.0 --gst-debug-level=3 rtspsrc protocols=tcp latency=50 location=rtsp://admin:Supervisor@... name=rtsp ! rtph264depay ! h264parse ! rtspclientsink latency=50 location=rtsp://${ip}:<port>/<path>
Restart=always
RuntimeMaxSec=24h
RestartSec=30s
[Install]
WantedBy=multi-user.target
Пояснения:
RuntimeMaxSec=24h
- перезапуск через 24 часов непрерывной работыRestartSec=30s
- в случае ошибки timeout - 30 секундВ случае, если у устройства меняется внешний IP, нужно его заменить в файле сервиса.