Автор Тема: Простой способ поднять стрим-сервер на Linux?  (Прочитано 24363 раз)

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Появилась задача. Нужно организовать раздачу изображения по LAN на телевизоры через несколько промежуточных компьютеров. Компьютеры к сожалению на Windows. Есть конечно ламерский способ - совать флэшку в каждый компьютер и просто запускать видео. Но хотелось бы что то более технически совершенное. Первое, что попалось под руку - это VLC. Он работает. Можно транслировать видео. Но нет гибкости. Даже если тупо запустить видео по кругу, на "сервере" оно транслируется, но "клиент" теряет поток в момент окончания видео и больше уже не может переподключится к потоку без посторонней помощи. Я так подозреваю, что это из за того, что поток не является целостным, а просто как бы запускается заново в момент окончания видео. Включение режима перекодировки не помогает.

Пришлось искать софт получше. Наткнулся на OBS Studio. Там есть куча всяких возможностей. Но проблема в том, что он не умеет как VLC транслировать в режиме HTTP сервера. Следовательно встал вопрос о поднятии промежуточного стрим-сервера. Так вот. Я не очень сильно шарю в Web-технологиях. Есть ли какой-то простой способ поднять стрим-сервер, чтобы рестримить видео из OBS Studio к HTTP-клиентам, включая например тот же VLC?

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Ладно. Вопрос в принципе снят. Во первых я обнаружил, что контейнер MPEG-TS в отличие от MP4 не приводит к прерываниям стрима при запуске видео с начала. Надо конечно конвертировать видео заранее, чтобы конвертирование в реальном времени не отжирало 30% процессора, но чтож поделать. А во вторых я обнаружил, что ретранслировать стрим из UDP в HTTP в принципе может тот же самый VLC. Проблема оказалась в другом. Никакие комбинации кодеков в OBS Studio не дают вменяемого результата. Т.е. если в самом VLC я спокойно использую комбинацию MPEG-TS+h264+MP3, то та же комбинация в OBS не дает никакого результата. Максимум смена кодека на AAC приводит к появлению хотя бы какого-то корявого звука. Но изображение не появляется ни при каких обстоятельствах, а очень жаль. Перспектива была очень хорошая.

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
В итоге все заработало. Это просто стандартная проблема Linux, что ничего не работает из коробки без двухдневного ковыряния настроек и курения манов.

Но возник новый вопрос. Стриминг жрет достаточно много ресурсов компьютера. Я не хочу, чтобы все это крутилось круглые сутки на каком-то рабочем компьютере. Хочу поднять для этого отдельный компьютер на Linux. И вот что меня волнует. Как им рулить удаленно? Во первых OBS Studio и VLC скорее всего не заработают без GUI, а было бы неплохо снизить нагрузку на компьютер путем отключения GUI и включения только по требованию. Но и это еще не все. Я привык подключаться по SSH. Но, насколько я понимаю, SSH поднимает новый виртуальный монитор. Будет ли OBS Studio работать через него? И не упадет ли, если я отключусь? Или все таки VNC в этом случае является единственным решением? Какую программу лучше использовать? Я просто пробовал в свое время несколько программ и ни одна из них не дала приемлемого результата.

Оффлайн Александр Ерещенко

  • Завсегдатай
  • *
  • Сообщений: 1 153
Не знаю, как OBS Studio, но VLC очень даже умеет работать без GUI. https://forum.videolan.org/viewtopic.php?t=64483
В том числе и под виндой как служба.
У VLC очень богатый набор опций командной строки. vlc --helpНасчет подключиться по ssh, запустить, отключиться - смотрите на tmux / screen. Либо оформить как сервис, чтобы совсем по феншую было :)

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Просто придется рулить 4-мя компьютерами и хотелось бы это дело как то по максимуму автоматизировать и сделать доступ универсальным. Буду наверное экспериментировать с различными VNC серверами и клиентами.

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Ну вроде получается. Для безопасности соединения на Windows 10 поставил встроенный в нее OpenSSH. А потом TightVNC, на который в итоге упал выбор. В качестве управляющей программы выбран mRemoteNG. По сути единственная программа, где разработчики догадались, что может понадобится прокинуть несколько SSH клиентов одновременно, да еще и пустить через них данные с встроенных в эту же программу VNC-клиентов. Теперь осталось только поднять сервер на Linux и проделать на нем то же самое.

Единственная проблема - VNC соединение падает, когда я открываю полноэкранное видео, т.е. делаю по сути то, ради чего все и задумывалось. Пока не знаю, какое из звеньев является слабым. Может VNC сервер, может VNC клиент, может SSH сервер, может быть сами клиентские компьютеры слабые, может быть тот факт, что соединение у меня 100Мбит, а не гигабит. В первую очередь попробую заменить свитч на гигабитный. Благо сетевые карты в компьютерах именно гигабитные. А там может вообще напишу программу на основе PasLibVlc, чтобы она выдавала изображение не в режиме дублирования с рабочего стола, а на другой дисплей.
« Последнее редактирование: 31.08.2020 16:34:13 от Mr.Madguy »

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Ну я все настроил. И проблема вот в чем. На Windows VNC сервер позволяет управлять собственно рабочим столом. На Linux же по сути создается новый виртуальный дисплей. И на этом виртуальном дисплее очевидно не работает OBS Studio. Она просто закрывается. Т.е. толку от такого VNC сервера никакого, т.к. я могу с тем же успехом просто прокинуть X-сы по SSH и войти на машину с Cygwin или из под виртуалки того же Linux. Мне нужно именно управлять рабочим столом, а не создавать новый виртуальный. Есть ли такая возможность?

Оффлайн Александр Ерещенко

  • Завсегдатай
  • *
  • Сообщений: 1 153
Можно явно указать при запуске в параметре номер имеющегося дисплея:
x11vnc -display :0

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Можно явно указать при запуске в параметре номер имеющегося дисплея:
x11vnc -display :0
С тем, что есть еще и x11vnc, я уже разобрался. А вот запустить его как сервис systemd пока почему-то не получается. Linux такая штука. Ничего не работает из коробки. Может кто то подскажет рабочий файл службы systemd? Запускаю пока что просто по SSH как x11vnc -display :0 -usepw. И судя по логу отваливается все время при высокой нагрузке именно клиент. Возможно придется выбрать другой клиент VNC. Или может быть у mRemoteNG есть какие-то настройки по этому поводу? Будет жаль, т.к. очень удобно запускать и SSH подключения и VNC из одного места.

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
Можно явно указать при запуске в параметре номер имеющегося дисплея:
x11vnc -display :0
С тем, что есть еще и x11vnc, я уже разобрался. А вот запустить его как сервис systemd пока почему-то не получается. Linux такая штука. Ничего не работает из коробки. Может кто то подскажет рабочий файл службы systemd? Запускаю пока что просто по SSH как x11vnc -display :0 -usepw. И судя по логу отваливается все время при высокой нагрузке именно клиент. Возможно придется выбрать другой клиент VNC. Или может быть у mRemoteNG есть какие-то настройки по этому поводу? Будет жаль, т.к. очень удобно запускать и SSH подключения и VNC из одного места.
Всё из коробки работает, не надо передёргивать. VNC использовать в 2020 году - всё равно, что на паровозе по железной дороге сейчас ездить.
Андрей Черепанов (cas@)

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Всё из коробки работает, не надо передёргивать. VNC использовать в 2020 году - всё равно, что на паровозе по железной дороге сейчас ездить.
А какая альтернатива? Я хоть и очень давно вожусь с компьютерами, но я больше программист, чем системный администратор, а потому с удаленным доступом к компьютерам я соприкасался очень редко. Ну, грубо говоря, гугление по этому поводу выдает только VNC, RDP и еще какие-нибудь проприетарные приложения, типа TeamViewer, которые работают только через интернет.

У меня 5 компьютеров. Один мой, который я как раз не хочу грузить лишней задачей, на одном стоит OBS Studio и ретранслятор VLC, на трех VLC-приемник. OBS Studio не работает на виртуальном дисплее. Только реальном. Всем этим нужно рулить через локалку. Я бы рад использовать что то другое, т.к. VNC явно не тянет управление полноэкранными приложениями. Трафик не проблема. Я поставил гигабитный свитч.

Не работает. Начнем с того, что без чтения гайда не разобраться. Это уже большой минус. Тот же TightVNC под Windows просто устанавливается, после чего тыкаются несколько интуитивно понятных настроек. Во всех гайдах написано разное. Если делать точно как в гайде - не работает. И мне, как не очень большому специалисту по Linux, не очень понятно в чем проблема. Все приходится делать методом проб и ошибок, перепробывая кучи разных настроек, пока оно наконец не заведется.

Например ни в одном гайде не указывается, что служба запускается под рутом, где passwd должен быть свой. А вот если бы я не догадался? А из под рута еще нужно какое-то Xauthority. Я тоже не знаю, что это такое и зачем оно. Так же сервер по умолчанию не работает в фоновом режиме. Ну например при последней попытке у меня кажется почти что то получилось, но sudo systemctl start x11vnc.service просто завис.
« Последнее редактирование: 02.09.2020 13:42:38 от Mr.Madguy »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
Всё из коробки работает, не надо передёргивать. VNC использовать в 2020 году - всё равно, что на паровозе по железной дороге сейчас ездить.
А какая альтернатива? Я хоть и очень давно вожусь с компьютерами, но я больше программист, чем системный администратор, а потому с удаленным доступом к компьютерам я соприкасался очень редко.
Удалённый доступ к существующему экрану дают (из свободного программного обеспечения): x11spice, x11vnc, x2go, xpra, vino. Мы заказчикам рекомендуем x11spice. Из проприетарного — assistant, teamviewer, anydesk, skype. 
Андрей Черепанов (cas@)

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Пока что пробую x11vnc, т.к., насколько я понимаю, x11spice использует другой протокол, а мне бы желательно иметь единообразие между 4-мя моими компьютерами.

Ну вот объясните мне, что я делаю не так? Когда я просто запускаю эту команду с sudo, то все работает. Когда же я запускаю как сервис, вылазит вот это:
Цитировать
● x11vnc.service - Start x11vnc at startup.
     Loaded: loaded (/lib/systemd/system/x11vnc.service; enabled; vendor preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Thu 2020-09-03 08:55:30 MSK; 448ms ago
    Process: 2403 ExecStart=/usr/bin/x11vnc -display :0 -bg -q -noxdamage -noxfixes -shared -forever -many -localhost -usepw -auth guess (code=exited, status=1/FAILURE)
   Main PID: 2403 (code=exited, status=1/FAILURE)
И не работает.
Конфиг такой:
Цитировать
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display :0 -bg -q -noxdamage -noxfixes -shared -forever -many -localhost -usepw -auth guess
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure
RestartSec=2
[Install]
WantedBy=multi-user.target

UPD Методом научного тыка был выявлен вот такой рабочий конфиг:
Цитировать
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display :0 -q -noxdamage -noxfixes -shared -forever -localhost -rbfport 5900 -rbfauth /root/.vnc/passwd -auth guess
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure
RestartSec=2
[Install]
WantedBy=multi-user.target
« Последнее редактирование: 03.09.2020 09:18:17 от Mr.Madguy »

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Ну в итоге вроде бы все получилось, как я хотел. Стриминг удалось поднять на VLC. Оставалось решить только одну проблему. Мне нужно было так же и видео по требованию, т.е. VOD. Т.к. иногда нужно, чтобы видео игралось именно с начала, а не откуда-нибудь с середины. Изначальный выбор пал на MiniDLNA. Но опять же возникли вечные проблемы опен-сурца. В VLC UPnP работает крайне нестабильно. В одной версии работает, в другой уже не работает. Вот в 3.0.9 работает, а в самой последней 3.0.11 уже нет. Симптомы весьма простые. UPnP просто не подает никаких признаков жизни, как будто его там вообще нет. Даже заголовок выбранной вкладки в левом верхнем углу плэй-листа не меняется, как будто там не кнопка, а просто мертвая заглушка. Проблема именно в VLC, т.к. Windows Media Player работает прекрасно в любых условиях. Короче мне не нравилась надежность и безопасность этой системы. Проще, когда ты запускаешь видео чисто по известному URL. VLM, не смотря на все старания, завести так и не удалось. Опять же особенность опен-сурца. Фичи, которые как бы есть и как бы их нет. Вроде фича такая есть и в интернете полно гайдов по тому, как ее использовать. Но при этом не понятно, работает ли она вообще или нет. Т.к., опять же, никаких признаков жизни не подает. Вроде как VLM сам по себе больше не поддерживается, но вроде с другой стороны этот функционал был включен в сам VLC. В итоге все таки пришлось поднять ngnix. Это оказалось сделать не так уж и сложно. Сначала вообще планировал полностью перейти с VLC на ngnix. Т.к. при этом OBS работает напрямую и без танцев с бубном с настройкой ffmpeg. Но мне не понравилось, как там работает стриминг. Во первых но жрет больше процессора, т.е. возможно происходит еще одно промежуточное преобразование видео, а во вторых при обрыве трансляции клиент зависает и, следовательно, потом не переподключается к восстановившемуся потоку. Так что пришлось вернуть VLC, который удалось запустить как демон. А в ngnix просто настроить VOD на основе RTMP.

Но это все прелюдия. Основной вопрос какой. Мне очень нравится, что VLC умеет делать трансляцию через HTTP. Мне кажется, что именно из за этого он и работает стабильнее, чем ngnix с RTMP. А потому мне очень жаль, что VLM в итоге не удалось поднять. В ngnix есть аналоги, который очень сильно рекламируют по всему интернету. Это HLS и DASH. Я хотел бы их попробовать. Все там конечно красиво. Но у меня есть вопрос. Система у меня не очень сильная. Не промышленный сервер, а обычный компьютер. Там перекодирование в фрагменты происходит в реальном времени или они постоянно записываются на диск? Они там кэшируются надолго сразу все или, например, только штук по 10, а после этого начинают перезаписываться? Я о чем. Не ухайдокает ли этот HLS мне диск?

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

П.П.С. Вот только написал, что VLM не заводится, а он взял и завелся! Конечно с ним есть пару проблем. Во первых видео очень долго запускается. Секунд 10-15. Это скорее всего особенность кодека. Но за ngnix я такого не замечал. А второе - это то, что все файлы предопределены в конфиге и не могут быть произвольными, как в ngnix. Надо теперь думать над скриптом для автогенерации конфига при старте демона. А там будем сравнивать, что лучше работает.
« Последнее редактирование: 22.09.2020 19:12:14 от Mr.Madguy »

Оффлайн Mr.Madguy

  • Давно тут
  • **
  • Сообщений: 249
Может кто то ответить на два простых вопроса?

1) Оказывают ли HLS и DASH высокую нагрузку на диск компьютера из за постоянной перезаписи фрагментов?
2) Почему VLM может не работать на стандартном порту RTSP 554? На 8554 работает, а на 554 нет. netstat показывает, что этот порт не занят другим приложением. Очень уж не хочется постоянно дописывать порт к URL. Хочется просто rtsp://192.168.0.1/Video.