В справке 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 ждёт аудиодорожку.
rtsp_transport в документации ffmpeg: значение tcp гонит RTP внутри управляющего соединения RTSP, без потерь UDP. Источник: ffmpeg.org, ffmpeg-protocols, rtsp.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 примет поток без предупреждений.