Обзор возможностей видеостримера Flussonic

За несколько лет программирования мы добавили большое количество различных возможностей в Flussonic, так что хочется немного рассказать о том, как Flussonic устроен и что он может.

Для начала напомню: Flussonic — это state of art видеостриминговая серверная программа, которая может брать видео из различных источников, записывать его по необходимости на диск и раздавать клиентам по различным протоколам. Может работать на Intel, ARM, Tilera и т.п. Отличительная особенность — особая легкость конфигурации, не требующая ни единого мегабайта XML для настройки и запуска.

Во внутренней структуре и функциональности можно выделить две больших и важных части: работа с видео потоками и работа с видеофайлами (VOD).

VOD


VOD — video on demand. Эта маркетинговая аббревиатура возникла из далеких глубин, когда сама идея того, что пользователь может взять и запросить видео у сервера тогда, когда захочет, а не по расписанию, казалась чем-то нереально крутым. На каком-то этапе развития компьютеров и сетей это действительно было достаточно крутым (сети тонкие, видео толстое, на всех локалки не хватит), хотя сегодня это уже вызывает легкую улыбку: подумаешь, эка невидаль, видео из интернета посмотреть.

С файлами меньше рассказывать, так что их вперед. Flussonic может читать файлы в которых в mp4 (mov) или на худой случай flv контейнере записано видео и аудио в кодеках h264, hevc (h265), aac, ac3, mp3 и отдавать это видео клиентам по протоколам rtmp, rtsp, HLS, HDS, DASH.

Важное отличие от ffmpeg в том, что Flussonic делает т.н. сегментирование на лету. Некоторые системы стриминга VOD требуют предварительной подготовки, например сегментирования видео (из mp4 файла делают кучу mpegts сегментов для HLS) или препроцессинга видео для сохранения рядом индекса для перемотки.

Т.е. Flussonic работает очень удобно для администратора: положил файлы и они доступны. Причем в отличие от обычного браузерного псевдостриминга нет необходимости процессить файлы и перемещать заголовок mp4 файла (moov атом) в начало. Мы потратили огромное количество сил и времени, что бы сделать чтение заголовков в mp4 быстрыми настолько, что Flussonic может в таком режиме сегментирования на лету отдавать многие и многие гигабиты в секунду с одного сервера.

Для особо нагруженных систем, где приходится собирать комбинированную HDD + SSD конфигурацию или трафик переваливает за 8-10 гигабит, Flussonic может включать кеш сегментов, но это уже тема для отдельного рассказа, как и наш механизм раздельных очередей для разных дисков. Можно так же настроить несколько разных путей для поиска файла, когда по каким-либо причинам не хочется собирать несколько дисков в RAID.

Для тех, кому не хватает одного сервера для хранения всех его (конечно же легально добытых) фильмов, Flussonic может забирать видео по HTTP по кусочкам. Т.е. если пользователь пришел к edge серверу с желанием посмотреть 3-х часовой фильм, то просмотр начнется практически сразу, а не когда весь фильм перекопируется на сервер. Забирать можно не только с простого HTTP сервера, но так же и с Amazon S3 (и совместимых) и различных вариантов Swift (OpenStack Storage) хранилищ.

Для всех вариантов размещения файлов (в том числе и мультипутей) у нас есть VOD менеджер с загрузкой. Можно загружать много файлов за один раз, создавать каталоги (в том числе и на Swift/S3) и заливать файлы. Транскодирование загруженных файлов под вопросом, эта фича временно выключена.

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

Если ваш поставщик контента крутит вас за договор и требует шифрования контента, то Flussonic может подготовить видео для Verimatrix или Conax клиента. Но это не самая веселая тема, не правда ли?

Live streaming


Работа с видео потоками — это гораздо более объёмная, проблемная и насыщенная часть нашей работы, чем работа с файлами.

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

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

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

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

Поддержка протоколов широкая: RTSP, MPEG-TS, RTMP, HLS (причем не только от флюссоника, но от всех серверов, не все так умеют), Shoutcast, управляемые серверные плейлисты и даже платы захвата SDI.

В другом случае Flussonic будет переключаться с первого источника на второй и дальше в случае отказа первого и возвращаться обратно после восстановления. Например, вы можете первым источником указать мультикаст с головной станции, а альтернативным источником добавить http поток от соседа.

Если никаких источников не осталось, можно указать файл-заглушку как источник для потока.

Можно указать поток как постоянно работающий (и в отличие от некоторых других серверов, это будет действительно постоянно 7/24 работающий поток, за которым не надо следить), а можно сконфигурировать его как поток, стартующий по запросу пользователя. Например, такое бывает, когда сконфигурировано много камер, не все из которых постоянно интересны.

Flussonic делает очень тонкую и хрупкую работу по «сшиванию» нескольких источников при переключении. Когда источник «мигает» или происходит переключение на другой, то метки времени в потоке идут так, как будто ничего не произошло.

Транскодирование
В обычном режиме Flussonic не меняет само видео, только меняет упаковку и отдает ровно то, что получил. Иногда это не годится и надо менять сам кодек (или его параметры типа битрейта), тогда надо запускать транскодирование. Это чрезвычайно ресурсоемкая процедура, которая снижает количество потоков на одном сервере с, условно, тысячи до десяти.

Flussonic умеет транскодировать на процессоре и скоро научится использовать интеловский Quicksync и Nvidia nvenc. Несколько Flussonic в группе могут осуществлять резервирование транскодирования, подхватывая потоки при падении одного из серверов.

Чаще всего транскодирование используется в IPTV для подготовки видео со спутника для трансляции в интернет на приставки и мобильные устройства, но иногда используют и для IP камер.

Запись в архив
Это действительно наша premium фича. Достаточно сказать, что нашим архивом пользуются для хранения годовых записей видео и для трансляции 5 тысячам одновременных пользователей и он с этим справляется, при этом мы можем пользоваться для архива как SSD/HDD, так и промышленными (считай медленными и веселыми) NAS-ами, доступными по NFS. А повозиться там есть с чем!

Наша реализация архива не требует никаких действий от пользователя типа отслеживания глубины записи или свободного места на диске, не нужно настраивать никаких баз данных, всё сделано нами, аккуратно запаковано в оттестированный код и просто работает. В архив пишутся почти все поддерживаемые кодеки: h264, hevc, aac, mp3, pcma, pcmu. Видео доступно в виде бесконечной ленты, которую можно просмотреть с любого момента.

Для историй с IP камерами мы умеем хранить информацию о срабатывании детектора движения. Архивом часто пользуются для вещания со сдвигом во времени (актуально для вещания евразийских телеканалов в Северной Америке).

Про архив мы напишем ещё несколько больших развернутых статей, так что пока скажем, что у нас порядка 30 различных способов добраться до архива, включая кластерные конфигурации, когда архив пишется в одном месте, а доступен со всех серверов.

Раздача видео
Как и в случае с файлами, Flussonic сегментирует потоки на лету для протоколов HLS, HDS, DASH, а заодно делает их доступными по протоколам RTMP, RTSP, HTTP MPEG-TS и заодно умеет засовывать в сеть мультикаст UDP MPEG-TS.

В отличие от некоторых других серверов, Flussonic хранит все сегменты в памяти. Альтернатива тут — запись на диск. Если не настроить tmpfs для временного хранения сегментов, то диск прийдется менять часто и грустно. Flussonic всё удерживает в памяти и дает возможность добраться до одного потока со всех ядер сервера, позволяя раздавать один телеканал по 20 гигабит в секунду (это с учетом сессий, но об этом ниже).

В механизм раздачи по UDP MPEG-TS у нас вложено огромное количество сил и в итоге эта подсистема умеет ровно без скачков выдавать в сеть видео, которое приходит 10-секундными блоками по HLS.

Для управления потоками, их настройкой и т.п. у нас есть веб-интерфейс с возможностью просмотра логов потока, графиков, редактированием настроек и т.п.

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

Сопутствующие возможности


Кроме раздачи видео у Flussonic есть ряд других востребованных фич.API & scripting
Нас регулярно спрашивают про возможность программирования внутри самого сервера и всегда выясняется, что это не нужно и достаточно нашего HTTP API. Flussonic предоставляет возможность управлять и получать информацию по HTTP, а так же вызывать внешние обработчики в определенных случаях: либо по HTTP, либо с помощью встроенного lua интерпретатора.

Так же большая часть функциональности доступна через SQL API. Да, наш Flussonic умеет прикидываться Mysql сервером (ох, сколько мы сделали, что бы разные ORM-ы поверили в то, что это Mysql) и отдавать внутренние данные в ответ на SQL запросы. Через SQL можно даже управлять потоками в целом кластере. Это бывает сильно удобнее, чем делать HTTP запросы, например, из Rails.

Авторизация и учет сессий
У нас учет сессий сделан в лучшем виде, мало кто может сравниться.

Клиенты спрашивают нас: сколько пользователей у меня смотрит видео? Когда все пользователи подключены по http mpegts или rtmp, сложностей нет никаких: достаточно посмотреть, сколько открытых сокетов. Всё осложняется с переходом на HLS, причем с учетом всей вариативности тех милых особенностей, которые приносят с собой различные клиенты. Надо склеивать последовательные HTTP запросы в сессии и делать это непросто.

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

Сбор статистики и графики
Пока мы делали систему для хранения графиков в Flussonic, мы сделали собственное сверхкомпактное хранилище для временных рядов и оно используется в каждом экземпляре нашего софта.

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

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

Ещё можно удобным образом указывать edge серверу пачку источников, что бы он сам решал с кого из них он может взять поток, за которым пришел пользователь. Когда потоков в системе пара тысяч, это становится очень удобно.

Flussonic Watcher


Watcher — это наш отдельный продукт, который запускается поверх Flussonic. Дело в том, что в самом Flussonic никаких пользователей нет. Логин единственный, и тот администраторский, живого человека в админку не пустишь — только администратора.

Watcher — это система управления пользователями и их правами доступа к IP камерам. В ней можно выдать права пользователям к группе камер, добавить, удалить людей. Есть механизм для быстрого поиска камер (когда их надо добавить 200 штук, это очень полезная вещь), можно покрутить PTZ камерой и т.п.

Про него также будем рассказывать отдельно.

Взять ключ на тест всегда можно на нашем сайте.

© Habrahabr.ru