Всё началось с того, как при мне с помощью 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;
                record off;
            }
        }
    }

    При желании, можно настроить 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 на аудио-каналах — это ужасно.

Вот теперь точно всё, спасибо за внимание ^_^

Комментарии (29)


  1. andreymal
    14.08.2018 11:59

    А как дела с лагами (не может же их не быть совсем даже с rtmp?) и синхронизацией потоков с разных камер друг с другом и со звуком?


    1. Himura Автор
      14.08.2018 12:10

      С RTMP уровень лагов такой же как и при обычном стриме. Не уверен что это минимально возможный уровнь, но вероятность высока) То есть точно не хуже чем если бы стрим шел бы напрямую с камер в Интернет. Тут многое зависит от стабильноости каналов связи.
      Задержка буферизации есть, несколько секунд, не синхронизирована между камерами. Так что этот способ может не очень хорошо работать для съемки одного и того же действия с нескольких ракурсов, но хорошо подходит для описанной ситуации — когда оперторы снимают независимый контент на разных частях площадки.
      Хотя ВОЗМОЖНО (не изучал) у OBS Studio есть инструменты синхронизации потоков. Это звучит как очень нужная фича.


    1. chupasaurus
      14.08.2018 13:27

      Подозреваю, что наибольший лаг будет в виде буффера у rtmp-модуля nginx, но поскольку он одинаковый на всех потоках, то его как бы и нетю


      1. Himura Автор
        14.08.2018 13:37

        Все равно со стационарным звуком и камерами это надо будет вручную сводить. А если какая-то из камер начнет подлагивать, ещё раз сводить. Но в идеальных условиях это будет работать, да )


  1. Alexsey
    14.08.2018 16:52

    В 2018 году как-то более модно для таких вещей использовать NDI. Его делают ребята, которые крутятся в разработке эфирных микшеров и прочего прикладного железа уже не один десяток лет так что они знают что и как надо делать. Для того же OBS есть плагин, хотя я больше предпочитаю более взрослое решение вместо OBS — vMix.


    1. Himura Автор
      14.08.2018 17:51

      Есть серьезные ребята, а есть опенсорс. Тут про второе. Иногда, как в случае с KiCAD, серьезные ребята юзают и развивают опенсорс. В данном случае, всё-таки нельзя сказать что это поделка "из говна и палок", OBSS и nginx вполне себе общепризнанные инструменты.
      Всегда найдутся те, кому коммерческие решения подходят лучше, но эта статья не для них.


      1. Alexsey
        15.08.2018 14:09

        NDI как бы бесплатен для использования. Плагин для OBS тоже в свободном доступе. Но если религия не позволяет использовать вообще все что не-open source (официальная реализация идет только в виде sdk насколько я помню) то тут все сложно, да.

        Network Device Interface (NDI®) is a royalty free standard developed by NewTek to enable video-compatible products to communicate, deliver, and receive broadcast quality video in a high quality, low latency manner that is frame-accurate and suitable for switching in a live production environment.


        А вот то что стриминг rtmp с телефона для того чтобы его использовать как камеру для OBS это не поделка из говна и палок — извините, но с этим можно поспорить.


        1. Himura Автор
          15.08.2018 14:20

          хорошо кода есть варианты.


  1. Rambalac
    14.08.2018 17:18

    Как-то всё откровенно убого.
    Мероприятие со смартфонов? Там же даже нормального освещения не будет.
    ВайФай может работать и будет на 1-2 устройствах, но с большим количеством при нормальном битрейте начнутся проблемы. А при том, что в округе будет полно других вайфайев, да ещё гости решат для ноутов со смартфона расшарить…

    Я стримлю прогулки с нормальной камеры в 1080 60р (параллельно запись в 4К 60р) через сотовый, битрейт 5Мбит. Сначала я пробовал подключить энкодер к сотовому без проводов, через 5Ghz, постоянно возникали проблемы в разных местах и я пенял на сотовую связь, битрейт просаживался порой до сотен килобит, хотя вроде уровень сигнала был хорошим. Что забавно, проблемы были только в городе, за городом было гораздо лучше. Как-то я попробовал расшарить инет для энкодера через USB кабель, и разница оказалась разительная. Проблемы со стримом почти пропали, а когда они были, то причина была очевидна из-за плохого уровня сигнала.


    1. Himura Автор
      14.08.2018 17:59

      "Из подручных материалов" значит совсем без специального оборудования, и при чем тут вообще освещение? Спасибо что поделились опытом. Но насчёт убогости, этот туториал не претендует на то чтобы расскзать как сделать убер-качественный стрим, а призван дать относительно рабочий тулсет тем у кого есть соответствующая задача и нет никаких средств для ее реализации. Может кто-то вообще не знал что так можно сдедать без серьезных инструментов.


      1. Rambalac
        14.08.2018 18:07

        Идея «ходить по разным площадкам мероприятия». Думаете этим будут заниматься бесплатно?


        1. Himura Автор
          14.08.2018 18:27

          Сами организаторы и их волонтеры — вполне. Огромное количество мероприятий, особенно всяких региональных Аниме-фестивалей и гик-конвентов делаются в условиях очень ограниченного финансирования и очень большого желания, я вижу офигенное применение этим технологиям в такой среде


          1. Rambalac
            14.08.2018 18:59

            Я как бы тоже не телестудия. Видимо у нас разные стандарты качества. Унылое пятнистое из квадратов видео записанное трясущимися руками и постоянно обрывающиеся я бы не стал смотреть даже за плату.


            1. Himura Автор
              14.08.2018 19:10

              Унылость зависит от содержания, пятнистость, пиксельность и прерывания — от апстрима и топологии, а трясущиеся руки от операторов. Ничто из этого не связано с самой технологией, представленной в статье. При её использовании можно добиться преемлимого качества. Аналогично, телестулийное оборудование не гарантирует что стрим будет топовый.


            1. OnelaW
              15.08.2018 12:53

              Паркуа бы и не па, Вполне годное вступление для любителей и подаванов от профессии.

              Тем и ценны такие статьи.


    1. Gavabkv
      15.08.2018 15:15

      А можете чуть подробнее рассказать, как вы это делаете? Какое ПО используете? Что за энкодер?


      1. Himura Автор
        15.08.2018 15:16

        Пологаю, вопрос адресован Rambalac


      1. Rambalac
        15.08.2018 15:30

        • Камера — Lumix GH5, пишет внутрь 4К 60р и выдаёт 1080 60р по HDMI
        • Энкодер — Cerevo Liveshell X, принимает по HDMI сигнал и кодирует в 1080 60p h264 High profile, и отправляет по RTMP через USB Ethernet сетевой карте. У энкодера также есть нормальный RJ45. Энкодер может кодировать в 3 потока на разные эндпоинты и/или записывать на отдельную microSD. Есть h265, но RTMP его не поддерживает, поэтому получать его можно только приконнектившись к энкодеру (а не энкодер коннектится).
          У энкодера есть встроенная батарея часов на 6.
          Если достаточно 720 30р в один поток, то можно взять LiveShell 2, у него тоже есть батарея на пару часов.
          У всех Liveshell есть управление через их сервер, у Liveshell X так же есть локальный вебсервер. Через веб проводятся настройки эндпоинта, кодера, есть даже аппаратное добавление надписей на картинку.
        • В роли Ethernet сетевой карты выступает сотовый с USB тезерингом.
        • Стримлю я напрямую на Ютуб, тут всё стандартно. Никакое отдельное ПО не использую.


        1. Gavabkv
          15.08.2018 15:48

          Благодарю! 3 вопроса:
          1) Пробовали стримить в 3 сервиса одновременно через телефон? Просадки фпс были?
          2) От кабеля HDMI в камере стабилизатор не теряет горизонт?
          3) Не устаете ходить по часу с таким обвесом?


          1. Rambalac
            15.08.2018 15:57

            Не, через телефон даже 2 не потянет. ФПС не просаживается, падает качество.
            Стабилизатор достаточно хорошо адаптируется.
            Ну устаю, но ведь это главная цель, а видео просто для фана.


          1. Himura Автор
            15.08.2018 16:04

            Чтобы стримить в кучу сервисов есть Restream


            1. Gavabkv
              15.08.2018 16:26

              1) Платный (ну это еще терпимо:))
              2) Говорят просадки бывают по пиковым временам


              1. Himura Автор
                15.08.2018 16:29

                Бесплатный если по нескольку стримов в один сервис не нужно (например на две страницы ВК стримить нельзя, но ВК и в Ютюб можно)


  1. Gavabkv
    15.08.2018 16:33

    И еще нельзя бесплатно стримить в Facebook.

    upd. Не туда…


  1. exsstas
    16.08.2018 11:47

    Для Андроида мне больше всего IP Webcam понравилась для похожих целей — много настроек, скрипты + возможность помимо картинки отдавать данные акселерометра и других датчиков (например, прикинуть по данным акселерометра какая из камер сейчас наиболее стабильна и при этом сенсор освещенности дает хорошие значения и выводить её, как основную. Правда я не уверен, что OBS но это способен, но в TouchDesigner реализуется без проблем)


    1. Himura Автор
      16.08.2018 12:13

      Нет, этот софт упомянается в статье и не обеспечивает хоть какой-либо стабильности и плавности потока. Не пойдет. Надо RTMP


      1. exsstas
        16.08.2018 12:20

        Там есть поток на RTSP помимо чуть тормознутого HTTP


        1. Himura Автор
          16.08.2018 12:42

          Надо тестить)
          Но всё-таки кажется что чисто клиентские приложухи для отправки стрима будут быстрее.


          1. andreymal
            16.08.2018 17:12

            Я когда-то занимался извращениями, прокидывая SSH-туннель на мобильном интернете с серым IP (Теле2), чтобы забирать RTSP-поток у IP Webcam. Если не слишком задирать битрейт, чтоб скорости хватало, и добавить немного буферизации для компенсации интернет-лагов, то в целом работало неплохо) Хотя RTMP скорее всего лучше, да