Всё началось с того, как при мне с помощью 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; record off; } } }
При желании, можно настроить 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 на аудио-каналах — это ужасно.
Вот теперь точно всё, спасибо за внимание ^_^
Комментарии (29)
Alexsey
14.08.2018 16:52В 2018 году как-то более модно для таких вещей использовать NDI. Его делают ребята, которые крутятся в разработке эфирных микшеров и прочего прикладного железа уже не один десяток лет так что они знают что и как надо делать. Для того же OBS есть плагин, хотя я больше предпочитаю более взрослое решение вместо OBS — vMix.
Himura Автор
14.08.2018 17:51Есть серьезные ребята, а есть опенсорс. Тут про второе. Иногда, как в случае с KiCAD, серьезные ребята юзают и развивают опенсорс. В данном случае, всё-таки нельзя сказать что это поделка "из говна и палок", OBSS и nginx вполне себе общепризнанные инструменты.
Всегда найдутся те, кому коммерческие решения подходят лучше, но эта статья не для них.Alexsey
15.08.2018 14:09NDI как бы бесплатен для использования. Плагин для 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 это не поделка из говна и палок — извините, но с этим можно поспорить.
Rambalac
14.08.2018 17:18Как-то всё откровенно убого.
Мероприятие со смартфонов? Там же даже нормального освещения не будет.
ВайФай может работать и будет на 1-2 устройствах, но с большим количеством при нормальном битрейте начнутся проблемы. А при том, что в округе будет полно других вайфайев, да ещё гости решат для ноутов со смартфона расшарить…
Я стримлю прогулки с нормальной камеры в 1080 60р (параллельно запись в 4К 60р) через сотовый, битрейт 5Мбит. Сначала я пробовал подключить энкодер к сотовому без проводов, через 5Ghz, постоянно возникали проблемы в разных местах и я пенял на сотовую связь, битрейт просаживался порой до сотен килобит, хотя вроде уровень сигнала был хорошим. Что забавно, проблемы были только в городе, за городом было гораздо лучше. Как-то я попробовал расшарить инет для энкодера через USB кабель, и разница оказалась разительная. Проблемы со стримом почти пропали, а когда они были, то причина была очевидна из-за плохого уровня сигнала.Himura Автор
14.08.2018 17:59"Из подручных материалов" значит совсем без специального оборудования, и при чем тут вообще освещение? Спасибо что поделились опытом. Но насчёт убогости, этот туториал не претендует на то чтобы расскзать как сделать убер-качественный стрим, а призван дать относительно рабочий тулсет тем у кого есть соответствующая задача и нет никаких средств для ее реализации. Может кто-то вообще не знал что так можно сдедать без серьезных инструментов.
Rambalac
14.08.2018 18:07Идея «ходить по разным площадкам мероприятия». Думаете этим будут заниматься бесплатно?
Himura Автор
14.08.2018 18:27Сами организаторы и их волонтеры — вполне. Огромное количество мероприятий, особенно всяких региональных Аниме-фестивалей и гик-конвентов делаются в условиях очень ограниченного финансирования и очень большого желания, я вижу офигенное применение этим технологиям в такой среде
Rambalac
14.08.2018 18:59Я как бы тоже не телестудия. Видимо у нас разные стандарты качества. Унылое пятнистое из квадратов видео записанное трясущимися руками и постоянно обрывающиеся я бы не стал смотреть даже за плату.
Himura Автор
14.08.2018 19:10Унылость зависит от содержания, пятнистость, пиксельность и прерывания — от апстрима и топологии, а трясущиеся руки от операторов. Ничто из этого не связано с самой технологией, представленной в статье. При её использовании можно добиться преемлимого качества. Аналогично, телестулийное оборудование не гарантирует что стрим будет топовый.
OnelaW
15.08.2018 12:53Паркуа бы и не па, Вполне годное вступление для любителей и подаванов от профессии.
Тем и ценны такие статьи.
Gavabkv
15.08.2018 15:15А можете чуть подробнее рассказать, как вы это делаете? Какое ПО используете? Что за энкодер?
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 тезерингом.
- Стримлю я напрямую на Ютуб, тут всё стандартно. Никакое отдельное ПО не использую.
Gavabkv
15.08.2018 15:48Благодарю! 3 вопроса:
1) Пробовали стримить в 3 сервиса одновременно через телефон? Просадки фпс были?
2) От кабеля HDMI в камере стабилизатор не теряет горизонт?
3) Не устаете ходить по часу с таким обвесом?Rambalac
15.08.2018 15:57Не, через телефон даже 2 не потянет. ФПС не просаживается, падает качество.
Стабилизатор достаточно хорошо адаптируется.
Ну устаю, но ведь это главная цель, а видео просто для фана.
exsstas
16.08.2018 11:47Для Андроида мне больше всего IP Webcam понравилась для похожих целей — много настроек, скрипты + возможность помимо картинки отдавать данные акселерометра и других датчиков (например, прикинуть по данным акселерометра какая из камер сейчас наиболее стабильна и при этом сенсор освещенности дает хорошие значения и выводить её, как основную. Правда я не уверен, что OBS но это способен, но в TouchDesigner реализуется без проблем)
Himura Автор
16.08.2018 12:13Нет, этот софт упомянается в статье и не обеспечивает хоть какой-либо стабильности и плавности потока. Не пойдет. Надо RTMP
exsstas
16.08.2018 12:20Там есть поток на RTSP помимо чуть тормознутого HTTP
Himura Автор
16.08.2018 12:42Надо тестить)
Но всё-таки кажется что чисто клиентские приложухи для отправки стрима будут быстрее.andreymal
16.08.2018 17:12Я когда-то занимался извращениями, прокидывая SSH-туннель на мобильном интернете с серым IP (Теле2), чтобы забирать RTSP-поток у IP Webcam. Если не слишком задирать битрейт, чтоб скорости хватало, и добавить немного буферизации для компенсации интернет-лагов, то в целом работало неплохо) Хотя RTMP скорее всего лучше, да
andreymal
А как дела с лагами (не может же их не быть совсем даже с rtmp?) и синхронизацией потоков с разных камер друг с другом и со звуком?
Himura Автор
С RTMP уровень лагов такой же как и при обычном стриме. Не уверен что это минимально возможный уровнь, но вероятность высока) То есть точно не хуже чем если бы стрим шел бы напрямую с камер в Интернет. Тут многое зависит от стабильноости каналов связи.
Задержка буферизации есть, несколько секунд, не синхронизирована между камерами. Так что этот способ может не очень хорошо работать для съемки одного и того же действия с нескольких ракурсов, но хорошо подходит для описанной ситуации — когда оперторы снимают независимый контент на разных частях площадки.
Хотя ВОЗМОЖНО (не изучал) у OBS Studio есть инструменты синхронизации потоков. Это звучит как очень нужная фича.
chupasaurus
Подозреваю, что наибольший лаг будет в виде буффера у rtmp-модуля nginx, но поскольку он одинаковый на всех потоках, то его как бы и нетю
Himura Автор
Все равно со стационарным звуком и камерами это надо будет вручную сводить. А если какая-то из камер начнет подлагивать, ещё раз сводить. Но в идеальных условиях это будет работать, да )