Привіт світ. Продовжую вивчати прості і всім відомі штуки. Сьогодні взнав як зробити собі трансляцію по RTMP, і напишу про це (переважно сам для себе) короткий брудний howto.
Одразу уточнюю: 1) не через OBS Studo, 2) не на YouTube.
Я просто хочу дивитися відео зі своєї веб-камери з мінімальною затримкою. Комп з камерою і комп для перегляду обидва знаходяться в локальній мережі. Ніякого інтерактивного GUIшного софта, тільки ffmpeg та інші scriptable консольні програми.
Раніше я знав лише один супер-простий метод, про який писав колись:
ssh -Y foohost mplayer -vo x11 tv://
(Не робіть так, це страшенні гальма + великий overhead).
Як можна зробити краще
Погнали.
В принципі у нас може бути три різних хоста: комп з камерою, комп для перегляду і проміжний хост з RTMP-сервером. В моєму випадку RTMP-сервер може бути там же, де знаходиться камера.
Сервер
Перше, що нам треба — запустити сервер RTMP. Можна зробити RTMP-сервер через Nginx та mod_rtmp
. А у найпростіших випадках (і щоб погратися) достатньо взяти готовий контейнер:
docker run --rm -p 1935:1935 tiangolo/nginx-rtmp
Йому треба лише 1935 порт.
Припустимо, що це хост з адресою 192.168.0.99
, тоді адреса нашої трансляції буде rtmp://192.168.0.99/live/123
(де /live/123
це довільний обраний мною шлях).
Камера
Мені потрібна трансляція без звуку. Нехай це камера /dev/video0
. Тоді на компі з камерою запускаємо таку магію, де крім /dev/video0
та адреси трансляції для початку краще нічого не чіпати:
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 \
-pix_fmt yuv420p -framerate 15 -g 30 -b:v 500k \
-preset ultrafast -tune zerolatency \
-f flv rtmp://192.168.0.99/live/123
Я нагуглив перший-ліпший випадковий howto і прибрав згадки про звук. Якщо вам буде треба звук (і якщо у вас ALSA), то йдіть подивіться оригінальний пост.
Перегляд
Ну найпростіше, що можна зробити, це щось типу такого:
mplayer rtmp://192.168.0.99/live/123
Воно працює. Але ну його до біса! Затримка більше 10 секунд мені абсолютно не підходить. Ось кращий варіант:
mpv --no-cache --untimed --no-demuxer-thread \
--video-sync=audio --vd-lavc-threads=1 \
rtmp://192.168.0.99/live/123
або такий:
ffplay -autoexit -flags low_delay -framedrop \
-strict experimental -vf setpts=0 -tcp_nodelay 1 \
rtmp://192.168.0.99/live/123
І от тут, нарешті, я починаю бачити в цьому всьому профіт. Я можу дивитися в камеру+екран як в дзеркало і не відчувати затримку.
P.S. Що я не знайшов, так це нормального рішення для перегляду стріму на Android. Запускаю там VLC, воно все працює, але лаг 15 секунд. Може хтось порадить рішення краще.