Как направить поток с IP-камеры в YouTube-трансляцию через ffmpeg

Как направить поток с IP-камеры в YouTube-трансляцию через ffmpeg

В справке YouTube по настройкам кодировщика для прямых трансляций указаны протокол RTMP или RTMPS, видео H.264, H.265 или AV1, звук AAC или MP3 и ключевой кадр раз в 2 секунды, но не реже чем раз в 4. Большинство IP-камер отдают по RTSP как раз H.264, поэтому поток можно переслать в YouTube через ffmpeg без перекодирования. Ниже рабочая схема на небольшом VPS, обновлённая под 2026 год.

Задача такая: забрать RTSP с камеры и непрерывно отдавать его в YouTube Live, а если поток упал, поднять его автоматически. Раньше я делал это скриптом и cron, сейчас удобнее systemd: он сам перезапускает процесс и пишет логи.

Что нужно: камера, VPS и ключ трансляции

  • IP-камера с RTSP. Адрес вида rtsp://логин:пароль@IP:554/путь есть в документации камеры.
  • Сервер, который видит камеру: домашний мини-ПК в той же сети или VPS, например Hetzner Cloud (реферальная ссылка). Если камера дома, а сервер в облаке, нужен белый IP с пробросом порта или VPN.
  • Ключ трансляции из YouTube Studio: «Начать трансляцию», раздел с настройками потока.
  • ffmpeg из пакетов дистрибутива: sudo apt install ffmpeg.

В настройках камеры выставьте интервал ключевых кадров (I-frame interval или GOP) около 2 секунд: при 25 кадрах в секунду это 50. При пересылке без перекодирования ffmpeg не может поменять структуру кадров, а слишком редкие ключевые кадры YouTube отметит как проблему потока.

Команда ffmpeg: RTSP по TCP и RTMPS

Ключ -rtsp_transport tcp из документации ffmpeg по протоколу RTSP заставляет забирать поток по TCP: через интернет это надёжнее UDP, кадры не теряются. Видео копируется как есть, а если у камеры нет звука, подмешиваем тишину через anullsrc, потому что YouTube ждёт аудиодорожку.

ffmpeg -nostdin -rtsp_transport tcp -i "rtsp://user:pass@192.168.0.119:554/stream1" \
  -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \
  -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 128k -shortest \
  -f flv "rtmps://a.rtmps.youtube.com:443/live2/ВАШ_КЛЮЧ"

Если у камеры есть звук и он нужен, уберите вторую строку с anullsrc и замените -map 1:a:0 на -map 0:a:0. Если камера отдаёт H.265, а вы хотите максимальную совместимость, придётся перекодировать в H.264 (-c:v libx264 -preset veryfast -g 50), и нагрузка на процессор вырастет в разы. RTMPS шифрует поток до серверов YouTube, а обычный rtmp://a.rtmp.youtube.com/live2 тоже работает.

Автозапуск и перезапуск через systemd

Ключ и адрес камеры вынесем в отдельный файл с правами только для root, чтобы не светить их в юните и в списке процессов при просмотре конфигов:

sudo install -m 600 /dev/null /etc/cam2yt.env
sudo tee /etc/cam2yt.env >/dev/null <<'EOF'
RTSP_URL=rtsp://user:pass@192.168.0.119:554/stream1
YT_KEY=xxxx-xxxx-xxxx-xxxx-xxxx
EOF

Сам сервис. Restart=always из документации systemd перезапускает ffmpeg после любого падения, а DynamicUser=yes запускает его от временного непривилегированного пользователя вместо root:

# /etc/systemd/system/cam2yt.service
[Unit]
Description=IP camera to YouTube Live
After=network-online.target
Wants=network-online.target

[Service]
EnvironmentFile=/etc/cam2yt.env
ExecStart=/usr/bin/ffmpeg -nostdin -loglevel warning -rtsp_transport tcp -i ${RTSP_URL} -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 128k -shortest -f flv rtmps://a.rtmps.youtube.com:443/live2/${YT_KEY}
Restart=always
RestartSec=10
DynamicUser=yes

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now cam2yt
journalctl -u cam2yt -f

Нагрузка, сеть и безопасность

С -c:v copy процессор почти не нужен: ffmpeg просто принимает RTSP и упаковывает его в FLV. Главное ограничение это исходящий канал. Для 1080p при 30 кадрах YouTube рекомендует битрейт H.264 около 10 Мбит/с, но в реальности битрейт задаёт камера, и обычно он ниже.

Не публикуйте ключ трансляции в репозиториях и скриншотах. Если ключ утёк, сбросьте его в YouTube Studio. Не открывайте RTSP-порт камеры всему интернету: лучше VPN или проброс только с IP вашего сервера.

В итоге ретрансляция IP-камеры в YouTube укладывается в одну команду ffmpeg и короткий юнит systemd: RTSP по TCP, видео без перекодирования, тишина вместо звука, если его нет, и RTMPS до YouTube. Настройте у камеры ключевой кадр раз в 2 секунды, и YouTube примет поток без предупреждений.

Источники и ссылки


Комментарии загружаются…