Документация Flussonic Media Server

Contents

Публикация видео на сервер

Flussonic Media Server может принимать видео от программ и устройств, которые являются инициаторами начала видеотрансляции. Это называется публикация.

Публикация может использоваться в тех случаях, когда устройство не имеет статического IP адреса или вообще находится за NAT и Flussonic Media Server не сможет обратиться к этому устройству или программе за видео.

Что мы называем публикацией:

  • Передачу видео с любого мобильного устройства на сервер Flussonic.
  • Передачу видео из OBS (Open Broadcaster Software) или vMix на сервер Flussonic. Узнать больше
  • Передачу видео с HTML страницы в браузере через WebRTC на сервер Flussonic. Узнать больше

Также Flussonic может публиковать видео в социальные сети.

Что мы не называем публикацией:

  • Получение мультикаста
  • Прием потока из какого-либо источника

В этих ситуациях Flussonic неким образом подключается к источнику. Но ситуация, когда Flussonic не делает ничего для того, чтобы инициировать соединение, называется публикацией: например, публикация — это когда мобильное устройство подключается к Flussonic для передачи видео на сервер.

Если быть точными, публикация видео в социальные сети не подходит под определение публикации, которое мы используем в документации.

Протоколы

Flussonic Media Server может принимать запросы на публикацию видео по протоколам RTMP, RTSP, HTTP MPEG-TS и WebRTC.

Содержание:

Публикация в статический поток

Если вы точно знаете под каким именем поток должен появиться на сервере, то вы можете создать поток и указать ему, что вы разрешаете в него публиковать, путём указания особого источника url publish://:

stream published {
  url publish://;
}

Для применения настроек не забудьте выполнить команду:

/etc/init.d/flussonic reload

Важно! Начиная с версии Flussonic 19.01 вместо publish_enabled используется url publish://. Конфигурационный файл версии 19.01 не получится использовать в предыдущих версиях Flussonic. Новая директива 'url publish://' предлагает гораздо больше гибкости в управлении публикациями — вы можете использовать timeout, транскодирование и поддержку WebRTC.

Подробнее о том, как настроить публикацию

URL для публикации по разным протоколам

При публикации в статический поток вы можете публиковать видео используя следующие адреса:

  • rtsp://flussonic-ip/published
  • http://flussonic-ip/published/mpegts
  • rtmp://flussonic-ip/published
  • rtmp://flussonic-ip/static/published

Особенности URL для RTMP

Важно! Если при публикации по RTMP вы укажете простое имя потока, то у стороннего ПО может возникнуть вопрос — какое имя приложения использовать. Flussonic Media Server выкидывает rtmp из имени приложения, поэтому, если ПО обязательно требует какое-то имя приложения, укажите ему static. Это будет выглядеть так:

  • server URL: rtmp://flussonic-ip/static
  • stream name: published

Если вы используете сложное имя стрима, например client15/published1, то вы можете использовать:

  • server URL: rtmp://flussonic-ip/client15
  • stream name: published1

При такой конфигурации вы можете использовать все настройки потока.

Настройка публикации в статический поток через UI

Добавить параметр "url publish://" вы можете и через веб-интерфейс администратора Flussonic.

Чтобы создать статический поток с публикуемым источником:

  1. В административном интерфейсе создайте поток: Media > Stream > add.
  2. Заполните Stream name.
  3. Укажите publish:// в качестве Source URL. Либо, сохранив настройки, перейдите на вкладку Input и нажмите accept под Published input.
  4. Нажмите create. Публикация видео на сервер

Чтобы удалить публикуемый источник из настроек потока:

  1. Откройте созданный поток и перейдите во вкладку Input.
  2. 2. В разделе Published input нажмите ignore. Другой способ — нажать remove напротив URL, содержащего источник publish://. Публикация видео на сервер
  3. Нажмите save для применения настроек.

Публикация по динамическому имени

Зачем использовать динамическое имя и publishing location

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

  • Публикация длится ограниченный период времени (по сравнению с трансляцией телеканала, например) и происходит лишь один раз.
  • Может быть слишком много публикаций, чтобы создавать отдельный поток для каждой из них. Кроме того, вам пришлось бы прописывать настройки отдельно для каждого потока.
  • В некоторых случаях неизвестно, под каким именем внешнее приложение-клиент будет публиковать поток. Flussonic не знает имя потока, пока не придет запрос на публикацию видео на сервер. Зачастую имя выбирается произвольно (например, в случае с веб-чатами).

Flussonic позволяет решить эти проблемы с помощью создания префикса публикации (publishing location), где можно указать настройки сразу для множества потоков.

Динамическое имя означает, что полное имя потока формируется из предварительно настроенного префикса публикации и заранее не известного имени, определенного во внешнем приложении.

Таким образом, если вы заранее не знаете под каким именем будет публиковаться поток или этих потоков будет много, то настройте префикс публикации:

live chats {
}

Здесь chats — это префикс публикации. Все потоки, опубликованные под префиксом chats, будут иметь настройки, которые вы укажете в директиве live. О настройках потока см. в разделе про настройку потоков.

URL для публикации по разным протоколам

В этом случае вам надо публиковать стримы под именами с префиксом, например:

  • rtsp://flussonic-ip/chats/tempname
  • http://flussonic-ip/chats/tempname/mpegts
  • rtmp://flussonic-ip/chats/tempname

Что именно идет после chats — это дело клиента. Flussonic Media Server заранее не знает, какое именно это будет имя.

Настройка публикации по динамическому имени через UI

Создать префикс для публикации по динамическому имени (publishing location) можно через веб-интерфейс.

  1. Откройте вкладку Media: Публикация видео на сервер
  2. Найдите раздел Publishing locations и нажмите add: Publish locations
  3. Введите имя префикса и сохраните конфигурацию. Имя должно быть уникальным, состоять из английских букв, цифр, знака подчеркивания и слэша (/). Крайне не рекомендуется использовать другие символы — они могут быть восприняты различными программами на клиентах как служебные (сам Flussonic ограничений на имя не накладывает). Публикация видео на сервер Префикс для публикации создан.

О настройке других опций потока см. в разделе про настройку потоков.

Публикация по RTMP

С настройкой публикации по RTMP есть ряд сложностей. Дело в том, что протокол RTMP не имеет как таковых адресов. При подключении к серверу по RTMP клиент указывает имя сервера + имя приложения, а потом уже указывает в какой поток публиковать или какой поток проигрывать.

Обычно для сокращенной записи имя приложения и имя потока склеивают. Например, пара из rtmp://rtmp.myhosting.com/chats и chat-15 превращается в rtmp://rtmp.myhosting.com/chats/chat-15.

Стандартная практика при интерпретации RTMP адреса rtmp://rtmp.myhosting.com/chats/chat-15 — разделить путь после имени сервера по первому слешу и взять первую часть имени в качестве приложения.

В Flussonic Media Server нет концепции приложений, они существуют только в протоколе RTMP и отсутствуют в других протоколах, поэтому при публикации по RTMP используется следующая логика:

  1. Сервер склеивает имя приложения с публикуемым путем. Так пары rtmp://rtmp.myhosting.com/chats/my, chat-15 и rtmp://rtmp.myhosting.com/chats, my/chat-15 превратятся в публикуемое имя потока chats/my/chat-15.
  2. Ищется первый префикс публикации, который подходит под это имя. В нашем случае будет выбран префикс chats.
  3. Дальше во всех интерфейсах авторизации и т.п. имя потока будет полное: chats/my/chat-15.

Опубликовать по RTMP можно, например, с помощью ffmpeg:

ffmpeg -re -i /opt/flussonic/priv/bunny.mp4 -vcodec copy -acodec copy -f flv rtmp://localhost/chats/my/chat-15

При этом в веб-интерфейсе появится новый поток:

Публикация видео на сервер

Публикация по RTSP

Некоторые клиенты могут публиковать видео по RTSP.

Flussonic Media Server поддерживает автоматический выбор между UDP и TCP транспортом: как захочет клиент, так и будет принимать.

Имя потока должно быть полным: chats/my/chat-15

ffmpeg -re -i /opt/flussonic/priv/bunny.mp4 -vcodec copy -acodec copy -f rtsp rtsp://localhost/chats/my/chat-15

Публикация по MPEG-TS

При транскодировании потока с помощью ffmpeg можно опубликовать видео по HTTP, добавив суффикс mpegts:

ffmpeg -re -i /opt/flussonic/priv/bunny.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy -f mpegts http://localhost:8080/chats/my/chat-15/mpegts

Авторизация при публикации потока

Flussonic Media Server может проверять пароль при публикации потока. Укажите пароль в конфигурационном файле следующим образом:

  live live {
    password mypass;
  }

  stream s1 {
    password secure;
    url publish://;
  }

RTMP

Чтобы опубликовать в защищенную паролем зону поток по RTMP, укажите данные следующим образом:

rtmp application: rtmp://192.168.2.3/live

stream name: mystream?password=mypass

HTTP MPEG-TS

Чтобы опубликовать поток по HTTP MPEG-TS, укажите данные следующим образом:

http://192.168.2.3:8080/s1/mpegts?password=secure
ffmpeg -re -i video.mp4 -vcodec copy -acodec copy -f flv rtmp://192.168.2.3/live/mystream?password=mypass
ffmpeg -re -i video.mp4 -vcodec copy -bsf h264_mp4toannexb -acodec copy -f mpegts http://192.168.2.3:8080/s1?password=secure

Расширенная валидация публикации

Flussonic Media Server позволяет указать HTTP URL или пользовательский скрипт, которые будут проверять расширенную информацию об источнике публикации перед тем, как разрешить или запретить публикацию.

live chats {
  on_publish http://my-site.com/publish-check.php;
}

или

live chats {
  on_publish /etc/flussonic/publish_check.lua;
}

В HTTP запросе Flussonic Media Server передает по методу POST JSON объект с полями, описанными ниже. В lua скрипт передается объект req с такими же полями.

Передаются следующие поля:

  • name — имя публикуемого потока (например chats/15), включающее префикс публикации
  • location— префикс публикации
  • proto — протокол публикации (rtmp, rtsp, mpegts)
  • args — параметры из query string запроса. Для RTMP берется query string из имени публикуемого потока
  • ip — IP адрес источника

HTTP обработчик должен вернуть код 200, что бы публикация началась. Также может вернуть заголовок x-record, чтобы сообщить в какой файл записывать публикуемый поток.

lua скрипт должен вернуть пару true и объект, в котором допустимо поле record_path с путем для записи.

Важно! Если обработчик сообщает, куда записывать файл, то Flussonic Media Server будет писать бесконечный flv файл, не отслеживая ни его длину, ни возможную перезапись имеющегося файла.

Архив и динамические имена потоков

Вы можете сконфигурировать архив для live префикса:

live recorded {
  dvr /storage 3d 500G;
}

В этом случае публикуемое видео будет записываться и будет доступно даже если публикация остановилась.

Когда клиент перестает публиковать видео, то стрим через какое-то время пропадает и Flussonic Media Server про него почти ничего не знает. Почти — означает, что в индексе архива информация об этом видео потоке существует и Flussonic Media Server не потеряет эти файлы на диске.

Система зачистки архива удалит их по расписанию.

Перепубликация

Когда вы используете префиксы публикации, вы не можете использовать push в UDP:

live pushed {
  udp 239.0.0.1:1234;
}

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

Правильнее использовать push с шаблоном (%s) по другим протоколам:

live pushed {
  push rtmp://cdn-server/client43/%s;
}

При такой настройке для перепубликации стрима pushed/mystream будет использоваться адрес rtmp://cdn-server/client43/pushed/mystream