RTMP

Привіт світ. Продовжую вивчати прості і всім відомі штуки. Сьогодні взнав як зробити собі трансляцію по 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 секунд. Може хтось порадить рішення краще.