Це цікаво

Стрім з декількома камерами з підручних матеріалів

Все почалося з того, як при мені з допомогою OBS Studio і якоїсь програмки для анімації шпалер робочого столу зробили з логотипу видеологотип (який ще й під поточну грає музику анимировался). В той момент я зрозумів що OBS Studio може НАБАГАТО більше, ніж просто стримить гри. Після більш близького знайомства з OBS Studio, вона претендує на місце самої крутий програми, яку я коли-небудь зустрічав.

Мені належало стримить невеликий івент для друзів, але оскільки у мене є обладнання для хорошого звуку і бажання робити круто, я зацікавився організацією стріму з окремим звуком і декількома камерами. Стрім по різних причин вийшов такий собі, але після цього досвіду, начебто я уявляю як треба. І хочу поділитися. Ось.

Що?

Ідея полягає в тому, щоб знайти 2-3 бездротових оператора, які ходять по різним майданчикам заходи, спілкуються з людьми, знімають движуху, і т. д. (ну, як у серйозних хлопців, коротше). А хто сидить, комунікує з ними по рації, і формує з усього цього (і ще чого-небудь, наприклад, сдержимого всякого роду віконець/моніторів/проекторів) цікавий відеоконтент, який не нудно дивитися.

Також можна об’єднувати екрани декількох комп’ютерів в один стрім, можливо це може бути корисно для ігор. Хоча швидше за все конкретно для цієї задачі є й інші технології.

Навіщо?

Тому що це дозволяє робити дуже круто і сильно змістити технологічний стелю якості стріму практично задарма.

При використанні купи відеопотоків, крутота стріму буде визначатися вже творчої і організаційної складової (ну і якістю сполук).

Чому?

  1. Ноут
    1.1. OBS Studio
    1.2. nginx з модулем RTMP
  2. Оператори зі своїми смартфонами
    2.1. Яка-небудь приложуха з видачі за запитом “stream rtmp”, наприклад Ace Live Streaming або BitStream (але вони хочуть грошей і вотермарку малюють, на жаль. Швидше всього є менш зручні і жадібні софтина, діліться у коментарях)
  3. Стабільний вайфай
  4. Стабільний аплінк

При наявності ще чого-небудь, можна зробити хороший звук, хоча б на стаціонарних камерах (які можуть бути будь-якими відносно якісними вэбками).

А при наявності ще однієї ЕОМ на лінуксі (кажуть, навіть 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, і в доці теж годно написано. Короткий переказ у вільному стилі:

  1. Ставимо залежності:

    sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev

  2. Качаємо останню Mainline версію исходников звідси:

    wget http://nginx.org/download/nginx-1.15.2.tar.gz # Check for newer versions
    tar xzf nginx-* && cd !$

  3. Качаємо останню версію RTMP-модуля:

    wget https://github.com/arut/nginx-rtmp-module/archive/master.zip -O rtmp-module.zip
    unzip !$ -d .

  4. Створюємо 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.

  5. Компілюємо:

    make -j4

  6. Встановлюємо:

    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 в даному випадку безпечно, але все-таки не треба так.

  7. Перевіряємо

    $ /usr/local/nginx/sbin/nginx -v
    nginx version: nginx/1.15.2

  8. Налаштовуємо

    sudo vim /usr/local/nginx/conf/nginx.conf

    В кінці додаємо конфіг RTMP-сервера:

    rtmp {
     server {
     listen 1935;
     application live {
     live on;
     off record;
    }
    }
    }

    При бажанні, можна налаштувати HTTP-сервер на відображення статистики.
    В доці описано що ще можна налаштувати, там дійсно дуже багато всього. Якщо Ви знаєте, як зробити краще, буду радий додати розділ про конфігурацію сервера з матеріалом з коментарів.

  9. Робимо зручно

    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-сервером?

  1. Відправити на нього стрім з мобільного приложухи за адресою rtmp://<ваш локальний IP>:1935/live/habr де live — це ім’я RTMP-додатки в конфіги nginx, а habr — це Stream Key, який треба міняти для різних камер.

  2. Якщо Ви налаштували показ статистики (і не забули поміняти шлях до файлу stat.xsl), перевірити що стрім прийшов (за адресою http://localhost:8080/stat).

  3. Підключити до всіх стримам OBS Studio.

  4. PROFIT!!!

Очевидно, що сервер може бути не тільки локальних, але і доступним з внешки, що дозволить робити все те ж саме, але не через вайфай, а через Інтернет. Можна зробити свій аналог инстаграмовских групових стримов, ну і взагалі, безмежні можливості ))

Всі?

Є ще пара речей, які я пізнав на помилках і хотів би поділитися:

  1. Можна і потрібно змінювати цільової бітрейт кінцевого стріму по ходу трансляції, і підлаштовуватися під можливості з’єднання. Restream, наприклад, малює круті графіки, за якими зрозуміло на скільки треба знижувати. Є Pull Request на автодобір битрэйта, але він заглох ((
  2. Існує такий параметр Keyframe Interval, і він повинен бути більше секунди (це треба вручну задавати в Advanced-версії налаштувань Output). Restream про це розповідає тільки після закінчення стріму, UX на висоті! ))
  3. Є ще один дуже корисний Pull Request, в якому я взяв участь, і за який активно топлю, але він теж виглядає заглухлим, хоча мэйнтейнер про нього недавно згадав і переосмислив. Лайкніть, пліз, якщо Вам теж здається, що відсутність кнопки Monitor на аудіо-канали — це жахливо.

Ось тепер точно все, спасибі за увагу ^_^

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Check Also

Close
Close