Стрім з декількома камерами з підручних матеріалів
Все почалося з того, як при мені з допомогою OBS Studio і якоїсь програмки для анімації шпалер робочого столу зробили з логотипу видеологотип (який ще й під поточну грає музику анимировался). В той момент я зрозумів що OBS Studio може НАБАГАТО більше, ніж просто стримить гри. Після більш близького знайомства з OBS Studio, вона претендує на місце самої крутий програми, яку я коли-небудь зустрічав.
Мені належало стримить невеликий івент для друзів, але оскільки у мене є обладнання для хорошого звуку і бажання робити круто, я зацікавився організацією стріму з окремим звуком і декількома камерами. Стрім по різних причин вийшов такий собі, але після цього досвіду, начебто я уявляю як треба. І хочу поділитися. Ось.
Що?
Ідея полягає в тому, щоб знайти 2-3 бездротових оператора, які ходять по різним майданчикам заходи, спілкуються з людьми, знімають движуху, і т. д. (ну, як у серйозних хлопців, коротше). А хто сидить, комунікує з ними по рації, і формує з усього цього (і ще чого-небудь, наприклад, сдержимого всякого роду віконець/моніторів/проекторів) цікавий відеоконтент, який не нудно дивитися.
Також можна об’єднувати екрани декількох комп’ютерів в один стрім, можливо це може бути корисно для ігор. Хоча швидше за все конкретно для цієї задачі є й інші технології.
Навіщо?
Тому що це дозволяє робити дуже круто і сильно змістити технологічний стелю якості стріму практично задарма.
При використанні купи відеопотоків, крутота стріму буде визначатися вже творчої і організаційної складової (ну і якістю сполук).
Чому?
- Ноут
1.1. OBS Studio
1.2. nginx з модулем RTMP - Оператори зі своїми смартфонами
2.1. Яка-небудь приложуха з видачі за запитом “stream rtmp”, наприклад Ace Live Streaming або BitStream (але вони хочуть грошей і вотермарку малюють, на жаль. Швидше всього є менш зручні і жадібні софтина, діліться у коментарях) - Стабільний вайфай
- Стабільний аплінк
При наявності ще чого-небудь, можна зробити хороший звук, хоча б на стаціонарних камерах (які можуть бути будь-якими відносно якісними вэбками).
А при наявності ще однієї ЕОМ на лінуксі (кажуть, навіть Raspberry Pi ок для ≤3 потоків), можна трохи розвантажити основний комп і його мережа для обробки та відправлення стріму.
Як?
Загальновизнаний протокол для видеостриминга — RTMP. Спроби юзати щось ще ведуть до диким лагів, це була моя головна помилка.
Виявляється, прийняти RTMP-стрім і перенаправити його в OBS Studio — простіше простого. Треба всього-то скомпілювати nginx з кастомным модулем і написати конфіг. Але про це пізніше.
По-хорошому, треба робити так:
Тобто не давати мобілках Інтернет, щоб вони не витрачали ресурси ні на що крім стріму.
Але якщо хороший вайфай з Інтернетом вже є, то можна не гидувати і юзати його. Але відправляти кінцевий стрім все-таки бажано з іншого з’єднання, або, в крайньому разі, з того ж, але через дріт.
Якщо є необхідність приймати стріми з камер і відправляти кінцевий стрім через один і той же вайфай, перевірте стабільність (і врахуйте, що вона сильно знизиться якщо на цей вайфай полізе натовп девайсів).
Як підняти RTMP-сервер?
Краще робити це на лінуксі, щоб не мати проблем зі всякими MINGW/MSYS. І на окремому залозі (не обов’язково потужному). Або в докері, тоді можна скипнуть цей розділ, бо докерфайл вже є. Через WSL теж можна, але треба буде вручну прокинути TCP-порт 1935 в файрвол.
Ось відмінний мэнуал How to set up your own private RTMP server using nginx, і в доці теж годно написано. Короткий переказ у вільному стилі:
-
Ставимо залежності:
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev
-
Качаємо останню Mainline версію исходников звідси:
wget http://nginx.org/download/nginx-1.15.2.tar.gz # Check for newer versions tar xzf nginx-* && cd !$
-
Качаємо останню версію RTMP-модуля:
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip -O rtmp-module.zip unzip !$ -d .
-
Створюємо Makefile:
./configure --with-http_ssl_module --add-module=./nginx-rtmp-module-master
Якщо звалиться не дійшовши до
Configuration summary
, виправляємо проблеми.
Ця команда налаштує Ваш стримерский nginx жити в/usr/local/nginx/
і запускатися за командоюsudo /usr/local/nginx/sbin/nginx
. Таким чином nginx з репозиторію нічого не відчує. Це можна поміняти, вивчивши./configure --help
. -
Компілюємо:
make -j4
-
Встановлюємо:
echo "nginx with RTMP module" > description-pak sudo checkinstall --pkgname nginx-rtmp --provides nginx --nodoc --deldesc -y sudo mkdir /usr/local/nginx/logs/ # doesn't start without it
У принципі через
make install
в даному випадку безпечно, але все-таки не треба так. -
Перевіряємо
$ /usr/local/nginx/sbin/nginx -v nginx version: nginx/1.15.2
-
Налаштовуємо
sudo vim /usr/local/nginx/conf/nginx.conf
В кінці додаємо конфіг RTMP-сервера:
rtmp { server { listen 1935; application live { live on; off record; } } }
При бажанні, можна налаштувати HTTP-сервер на відображення статистики.
В доці описано що ще можна налаштувати, там дійсно дуже багато всього. Якщо Ви знаєте, як зробити краще, буду радий додати розділ про конфігурацію сервера з матеріалом з коментарів. -
Робимо зручно
alias rtmp-start="sudo /usr/local/nginx/sbin/nginx" alias rtmp-stop="sudo /usr/local/nginx/sbin/nginx -s stop" alias rtmp-status="cat /usr/local/nginx/logs/nginx.pid"
Що робити з RTMP-сервером?
-
Відправити на нього стрім з мобільного приложухи за адресою
rtmp://<ваш локальний IP>:1935/live/habr
деlive
— це ім’я RTMP-додатки в конфіги nginx, аhabr
— це Stream Key, який треба міняти для різних камер. -
Якщо Ви налаштували показ статистики (і не забули поміняти шлях до файлу
stat.xsl
), перевірити що стрім прийшов (за адресою http://localhost:8080/stat). -
Підключити до всіх стримам OBS Studio.
-
PROFIT!!!
Очевидно, що сервер може бути не тільки локальних, але і доступним з внешки, що дозволить робити все те ж саме, але не через вайфай, а через Інтернет. Можна зробити свій аналог инстаграмовских групових стримов, ну і взагалі, безмежні можливості ))
Всі?
Є ще пара речей, які я пізнав на помилках і хотів би поділитися:
- Можна і потрібно змінювати цільової бітрейт кінцевого стріму по ходу трансляції, і підлаштовуватися під можливості з’єднання. Restream, наприклад, малює круті графіки, за якими зрозуміло на скільки треба знижувати. Є Pull Request на автодобір битрэйта, але він заглох ((
- Існує такий параметр Keyframe Interval, і він повинен бути більше секунди (це треба вручну задавати в Advanced-версії налаштувань Output). Restream про це розповідає тільки після закінчення стріму, UX на висоті! ))
- Є ще один дуже корисний Pull Request, в якому я взяв участь, і за який активно топлю, але він теж виглядає заглухлим, хоча мэйнтейнер про нього недавно згадав і переосмислив. Лайкніть, пліз, якщо Вам теж здається, що відсутність кнопки Monitor на аудіо-канали — це жахливо.
Ось тепер точно все, спасибі за увагу ^_^