Cтрим с несколькими камерами из подручных материалов

  • Tutorial

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


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



Что?


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


Также можно объединять экраны нескольких компьютеров в один стрим, возможно это может быть полезно для игр. Хотя скорее всего конкретно для этой задачи есть и другие технологии.


Зачем?


Потому что это позволяет делать очень круто и сильно сместить технологический потолок качества стрима практически задаром.


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


Чем?


  1. Ноут
    1.1. OBS Studio
    1.2. nginx с модулем RTMP
  2. Операторы со своими смартфонами
    2.1. Какая-нибудь приложуха из выдачи по запросу "stream rtmp", например Larix Broadcaster, или (если есть немного лишних денег) Ace Live Streaming или BitStream
  3. Стабильный вайфай, желательно 5GHz
  4. Стабильный аплинк

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


А при наличии еще одной ЭВМ на линуксе (говорят, даже Raspberry Pi ок для ≤3 потоков), можно немного разгрузить основной комп и его сеть для обработки и отправки стрима.


Как?


Общепризнанный протокол для видеостриминга — RTMP. Попытки юзать что-то еще ведут к диким лагам, это была моя главная ошибка.


Справедливости ради, стоит отметить проприетарную технологию NewTek NDI (спасибо, Alexsey), которая вроде как круче, чем RTMP. Однако, для нашего юз-кейса, использование NDI потребует немало лишних денег.

Оказывается, принять RTMP-стрим и перенаправить его в OBS Studio — проще простого. Надо всего-то скомпилировать nginx с кастомным модулем и написать конфиг. Но об этом позже.


По-хорошему, надо делать как-то так:



То-есть не давать мобилкам Интернет, чтобы они не тратили ресурсы ни на что кроме стрима.
Но ежели хороший вайфай с Интернетом уже есть (а лишней точки доступа на 5GHz нет), то можно не брезговать и юзать существующие соединения. Однако, отправлять конечный стрим всё-таки желательно с другого соединения, или, в крайнем случае, с того же, но через провод.


Если есть необходимость принимать стримы с камер и отправлять конечный стрим через один и тот же вайфай, тщательно протестируйте стабильность (и учтите, что она сильно снизится если на этот вайфай полезет толпа девайсов).


Как поднять 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 на аудио-каналах — это ужасно.

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


P.S.


Для тех кто попытается всё-таки сбилдить nginx для вездесущей венды, вот грабли по которым я прошелся, тот еще квест оказался, я не зря этого процесса так опасался:


  • Необходимо брать исходники ИМЕННО из Mercurial (хорошо что там есть кнопка "скачать zip"), в архивах с сайта нет папки src\os\win32. Если у Вас исходники с сайта, будет ошибка don't know how to make 'src/os/win32/ngx_win32_config.h'.
  • Нужен древний MinGW отсюда а не чуть менее древний MSYS2.
  • При установке mingw-developer-toolkit нужно снять чекбокс с Perl. Perl должен быть виндовым.
  • Вот этот ответ хорошо помог.
  • При компиляции используется rc.exe из %ProgramFiles(x86)%\Windows Kits\10\bin\10.0.16299.0\x64, надо эту папку вручную в PATH добавить
  • Надо убрать флаг -WX из CFLAGS в Makefile, чтобы ворнинги не прерывали компиляцию, там в 1.15.3 есть ворнинги...

Итого, у меня получилось как-то так:


#cmd: "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
#cmd: set PATH=%PATH%;%ProgramFiles(x86)%\Windows Kits\10\bin\10.0.16299.0\x64
#cmd: C:\MinGW\msys\1.0\msys.bat
#bash: cd nginx-1.15.3

./auto/configure \
    --with-cc=cl \
    --with-debug \
    --prefix= \
    --conf-path=conf/nginx.conf \
    --pid-path=logs/nginx.pid \
    --http-log-path=logs/access.log \
    --error-log-path=logs/error.log \
    --sbin-path=nginx.exe \
    --http-client-body-temp-path=temp/client_body_temp \
    --http-proxy-temp-path=temp/proxy_temp \
    --http-fastcgi-temp-path=temp/fastcgi_temp \
    --http-scgi-temp-path=temp/scgi_temp \
    --http-uwsgi-temp-path=temp/uwsgi_temp \
    --with-cc-opt=-DFD_SETSIZE=1024 \
    --with-pcre=objs/lib/pcre-8.42 \
    --with-zlib=objs/lib/zlib-1.2.11 \
    --with-openssl=objs/lib/openssl-1.1.1 \
    --with-openssl-opt=no-asm \
    --with-select_module \
    --with-http_ssl_module \
    --add-module=nginx-rtmp-module-master

nmake

nginx-1.15.3-rtmp-win32.7z

Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 31

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

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

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

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

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

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

            0
            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 это не поделка из говна и палок — извините, но с этим можно поспорить.
        0
        Как-то всё откровенно убого.
        Мероприятие со смартфонов? Там же даже нормального освещения не будет.
        ВайФай может работать и будет на 1-2 устройствах, но с большим количеством при нормальном битрейте начнутся проблемы. А при том, что в округе будет полно других вайфайев, да ещё гости решат для ноутов со смартфона расшарить…

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

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

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

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

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

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

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

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

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

                  0
                  • Камера — 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 тезерингом.
                  • Стримлю я напрямую на Ютуб, тут всё стандартно. Никакое отдельное ПО не использую.
                    0
                    Благодарю! 3 вопроса:
                    1) Пробовали стримить в 3 сервиса одновременно через телефон? Просадки фпс были?
                    2) От кабеля HDMI в камере стабилизатор не теряет горизонт?
                    3) Не устаете ходить по часу с таким обвесом?
                      0
                      Не, через телефон даже 2 не потянет. ФПС не просаживается, падает качество.
                      Стабилизатор достаточно хорошо адаптируется.
                      Ну устаю, но ведь это главная цель, а видео просто для фана.
                        0

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

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

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

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

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

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

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

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

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

                      Кстати, крутые чуваки тоже юзают промежуточный RTMP-сервер


                      https://youtu.be/TCSyNKbapdE?t=1m28s

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое