Версия 26.09
Flussonic 26.09: DRM и своя витрина в Catena, SDI, ST 2110 и RIST в Mcaster, регистратор Watcher переезжает на новое ядро по кнопке
Четыре продукта, одно ядро
Catena, Mcaster, Agora и Watcher — четыре разных продукта с четырьмя разными заказчиками: оператор OTT, инженер головной станции, корпоративный вещатель и интегратор систем безопасности. Внутри у них один движок — Sapsan, наше стриминговое ядро на Rust.
Поэтому этот релизноут начинается с ядра. Всё, что перечислено в первом разделе, приехало сразу во все четыре продукта — и по той же причине находка на регистраторе с девятью тысячами камер в итоге ускоряет запуск телеканала.
Вот что мы сделали для стримингового ядра Sapsan
- 18 000 одновременных WebRTC-зрителей с одной ноды вместо 200–300.
- Больше 100 Гбит/с HLS с одной машины — провод кончился раньше, чем сервер.
- Чтение fMP4-источников — тех самых CMAF-сегментов, которыми сегодня отдают и HLS, и DASH; самый старый открытый запрос в нашем трекере, заведён в 2018 году.
- Субтитры закрыты полностью: телетекст и распознавание DVB-субтитров, оба обычной дорожкой WebVTT.
- Аппаратное транскодирование на NVIDIA и обход дефекта драйвера, мучившего нас ещё во времена Flussonic.
- Лэйаутер раскладывает стримы по 129 записанным правилам — и называет причину каждого своего решения.
- Учётные записи администраторов с ролями и отзыв доступа, который действительно отзывает.
В шестьдесят раз больше WebRTC-зрителей. WebRTC был самым слабым трактом раздачи. Нода держала 200–300 одновременных WHEP-сессий и около 0,9 Гбит/с, а дальше просто переставала принимать зрителей: на пятистах сессиях 448 из 500 отваливались по таймауту, при том что процесс занимал 330% из имевшихся у машины 7200%. Дело было не в нехватке мощности — вся подсистема WebRTC была одной задачей, обходившей все сессии под одним замком, поэтому создание сессии стояло в очереди за раздачей всем остальным.
Сессии разложены по шардам со своими циклами, и цифры сменили порядок. Одна нода держит 18 000 одновременных зрителей на 32 Гбит/с или 16 000 более тяжёлых на 42,9 Гбит/с — в установившемся режиме, без отвалившихся. Память на зрителя упала с 3,8 МБ до 0,6–0,7 МБ, и у очереди появился жёсткий предел: раньше шесть тысяч зрителей занимали 53 ГБ и уводили машину в своп.
Одна практическая заметка на случай, если будете мерить свою машину: около 8 Гбит/с из этого съедает дисциплина очереди fq, стоящая в Linux по умолчанию, — замена на pfifo_fast возвращает их обратно.
Отдельно: брошенные WHEP-сессии раньше жили вечно. Зритель закрывал вкладку, а сессия продолжала жечь процессор и растить память на 80 МБ/с до тех пор, пока процесс не убивали. Теперь такие сессии закрываются сами.
Больше 100 Гбит/с HLS с одной машины. Мы собирались вытянуть 100 Гбит/с через сетевую карту и вытянули — после чего ограничением стал слот PCIe 3.0 стенда, а не софт. По петле, где провод не мешает, тот же сервер отдал 376 Гбит/с открытым HTTP и 242 Гбит/с под TLS. Практический вывод не в самой цифре: на обычном железе тракт раздачи — не то, что у вас кончится первым.
Чтение fMP4. Тикет #5350 — «захват MPEG-DASH / HLS fmp4 источников» — заведён в марте 2018 года и собрал около полусотни клиентских обращений, самый длинный такой список в трекере. Просят там одно, а не два: современный источник, отдающий плейлистом, кладёт в сегменты fragmented MP4, а не MPEG-TS, — и именно fMP4 мы читать не умели. CMAF публикует всякий агрегатор, всякая чужая CDN и всякий контрибутор, которому не дают открыть UDP или SRT, — и до сих пор нам было нечего ответить.
Правило старта одно, и его стоит знать. Захват начинается с первого сегмента, появившегося после подключения: всё, что лежало в окне плейлиста, — история. Иначе источник с минутным окном вылил бы в канал минуту прошедшего медиа за несколько секунд, и делал бы это заново на каждом переподключении. Тем же правилом закрывается мёртвый источник: плейлист, оставшийся после закончившегося вещания, нового сегмента не родит никогда, поэтому захват просто не начнётся — вместо того чтобы стрим висел работающим на протухшем окне.
Субтитры доведены до конца. В 26.08 мы выпустили скрытые субтитры CEA-608/708 дорожкой WebVTT и пообещали распознавание DVB-субтитров следующей версией. Вот оно — а вместе с ним телетекст, вторая по распространённости форма субтитров в европейском эфире и единственная, где текст приезжает уже текстом.
Всё это устроено одинаково: каждый производитель текста — декодер телетекста, DVB OCR, скрытые субтитры, распознавание речи — пишет в один канонический слой, а зритель всегда получает обычную дорожку WebVTT. Что бы ни несла программа, абонент в вашем приложении видит то же меню субтитров, что и зритель того же канала по кабелю, и требования доступности выполняются без второго входа и без отдельного конвейера под каждый формат. Попутно в декодере телетекста починены две вещи, из-за которых он был бесполезен: порядок бит кода Хэмминга (страница 888 читалась как 811) и отсутствие национальных наборов символов, из-за которого умляуты и кириллица приезжали мусором.
Аппаратное транскодирование на NVIDIA. Весь видеотракт — декодирование, масштабирование, кодирование — уезжает на карту, выбранную явно или автоматически, и число каналов на сервер перестаёт упираться в то, сколько ядер вы купили.
Попутно мы наконец докопались до бага, который мучил нас ещё во времена Flussonic. Он оказался не наш: это дефект самого драйвера NVIDIA, и NVIDIA завела его как Bug 6610402. Пока он не исправлен в источнике, мы поставляем обход — так что до ваших установок он больше не доходит.
Лэйаутер делает работу, которую иначе делаете руками вы. Решить, какая нода ведёт какой стрим, всё равно кому-то приходится — и переделывать это заново каждый раз, когда машину добавили, вывели на обслуживание, перегрузили или потеряли. На нескольких серверах это держится в голове. На сотне — уже нет, а цена ошибки — канал вне эфира. Теперь лэйаутер Catena решает это по 129 правилам, записанным в документ политики раньше, чем в код, и тесты сверяются с тем же документом.
Что он закрывает, в терминах оператора. Требования, которые размещение не вправе нарушить: неймспейс, обязательные теги, стрим с транскодированием на карте — только на ноду с картой, стрим с архивом — только на ноду с архивным хранилищем, лимит числа стримов на ноду. Предпочтения, которыми разрешаются равные варианты. Переназначение, когда нода ушла в offline, выведена на обслуживание или выбыла из кластера, — при этом намеренно замороженная нода сохраняет ровно то, что несёт. Перегрузка с заданным порядком разгрузки: процессор выше 90%, сеть выше 95% лимита ноды, архив выше своего порога; первой разгружается сеть, резервные копии переезжают раньше захвата, самый тяжёлый стрим — первым. И роли помимо захвата: копии архива, остатки архива на машинах, которые стрим уже не ведут, раздача живого на эджах, таймшифт-стримы рядом с архивом, который они вещают.
Одну цифру стоит назвать прямо: за последний год 96% клиентских обращений по поводу лэйаутера оказались ошибкой в конфигурации на стороне клиента, а не дефектом лэйаутера. Движок редко бывал виноват — не хватало другого: возможности увидеть, почему он решил именно так. Эту половину релиз и закрывает: у каждого назначения теперь записана причина, а в консоли есть страница с прогонами, назначениями и ограничениями, которые не удалось удовлетворить.
Администраторы, роли и отзыв, который отзывает. До сих пор управляющий доступ был общим паролем и статическим ключом: нельзя было завести второго администратора, ограничить его в правах или закрыть доступ одному человеку, не сменив секрет всем сразу. Теперь есть нормальный реестр учётных записей администраторов с ролями. И отключение учётной записи прекращает работу немедленно — раньше отзывался только вход, а уже выданный токен ещё до пятнадцати минут создавал стримы и правил ноды.
Видно больше происходящего. График ошибок стрима разложился на линии по видам ошибок, а отказы уровня соединения — обрыв SRT-сессии, неудачный HTTP-запрос к HLS-источнику — вообще начали считаться, так что полная пропажа источника наконец видна на графике, а не только в логе. В Retroview поехали метрики качества источников, статистика сервера, инвентарь и загрузка видеокарт и счётчики транскодера. Если нода отказалась применить сохранённые настройки, причина доезжает до консоли, а не остаётся в локальном логе машины. А на установках с десятками дисков занятое место разложено на актуальный архив, брошенные записи и остальное — так что у вопроса «куда ушло место» появился ответ.
Вот что мы сделали для Catena
- DRM: шифрование CMAF с SPEKE — премиальный контент, одна зашифрованная копия на FairPlay, Widevine и PlayReady.
- Витрина для зрителя с настоящей программой передач, импортируемой из XMLTV.
- Таймшифт-каналы — «Первый +2» как самостоятельный канал, а не параметр в ссылке.
- Захват DASH на том же ридере fMP4 и отдача HLS в контейнере MPEG-TS для приставок, которые другого не принимают.
- Транскодирование VOD из консоли: шаблоны, задания, лестница качеств под MBR.
- Эдж-ноды раздают лайв, а не только архив, и поднимают стрим только когда его кто-то смотрит.
- Чтение архива Flussonic Media Server на месте — 70+ дисков и read-only пре-чек до того, как вы что-то тронете.
DRM, а значит — платное вещание. Это самый большой разрыв, державший операторов на Flussonic Media Server. Catena умела расшифровывать защищённый вход, но не умела защищать то, что раздаёт, — и потому не заменяла Flussonic ни на одном платном канале. Теперь заменяет. Стримы шифруются схемой CMAF cbcs, и одна зашифрованная копия обслуживает HLS/fMP4 для FairPlay и DASH для Widevine и PlayReady — паковать дважды не нужно. Ключи приходят либо с вашего сервера ключей по SPEKE v1 или v2, либо из конфигурации для проверки.
Кластерное устройство тут важно не меньше самой криптографии. Шифрование происходит на выходе с ноды, принявшей источник, а не при записи: архив хранит открытое, поэтому перемотка, миниатюры, транскодирование и аналитика продолжают работать. Эдж получает только шифротекст — ключ и учётные данные сервера ключей не покидают ноду захвата и не попадают в конфигурацию эджа. А при импорте конфигурации из Flussonic v3 стрим с секцией drm приезжает выключенным: массовая миграция не должна тихо начать вещать премиальный канал открытым.
Витрина с настоящей программой передач. Зрительское приложение Catena — то, которое ваши абоненты открывают на телевизоре или в браузере, — переехало на новое ядро вместе с бэкендом, который ему нужен. Абонент входит по своему токену, получает список каналов, на которые у него есть право, с готовыми адресами проигрывания, а вместе со списком приезжает билет — так работают ограничение по числу устройств и отзыв доступа, и витрине при этом не нужно знать ничего про служебные ключи.
За ней — программа передач, которой раньше не было ни в каком виде. Central теперь владеет источниками XMLTV, скачивает их по расписанию, хранит сетку и отдаёт её и витрине, и выходу MPEG-TS в виде EIT. Две практические заметки из разработки: импорт фильтрует передачи до тех каналов, которые вы действительно привязали, — реальный файл провайдера, на котором мы проверялись, содержал полтора миллиона передач по 4054 каналам, из которых 95% строк никто и никогда не прочитает, — а скачанный файл сохраняется, поэтому привязка нового канала переимпортируется сразу, не дожидаясь следующей загрузки.
Если у вас уже есть мидлварь. Многие наши клиенты продают свою, и Catena с ней не конкурирует. В такой связке Catena — это то, на что мидлварь указывает: один адрес проигрывания, балансировка зарезервирована внутри кластера, и отдельного железного балансировщика перед ней покупать, ставить в стойку и содержать не нужно. Витрина выше — для операторов, у которых мидлвари пока нет и которые не хотят начинать с того, чтобы её написать.
Таймшифт-каналы. «Первый +2» как полноценный канал. Перемотка была и раньше, но перемотка — это параметр в ссылке плеера: у сдвинутой версии не было своего имени, своей строки в списке каналов, своих сессий и статистики, её нельзя было запушить, защитить или отдать в зону CDN. Теперь таймшифт-канал — обычный стрим с необычным источником, а значит зрительские адреса, сессии, DRM и пуши достаются ему бесплатно. Один захват и глубокий DVR закрывают часовые пояса вместо приёма отдельной региональной версии на каждый.
Два последних разрыва по форматам. Catena захватывает источники DASH — это вторая половина того же тикета, работающая на том же ридере fMP4, что описан выше. Вдвоём с HLS они закрывают CMAF-ориджины, шлюзы DVB-I и облачные пакеджеры, которые публикуют что-то одно. Отличие у DASH ровно одно, и оно честное: манифест не перечисляет, что лежит, а даёт время старта и шаблон, поэтому какой сегмент уже можно взять — считается от настенных часов, а не читается из списка. А на выходе HLS отдаётся в контейнере MPEG-TS наравне с fMP4, по своему адресу, для старых плееров и приставок, которые другого не принимают. Вместе это снимает два последних ответа вида «Flussonic это умел, а Catena нет» — на входе и на выходе.
VOD перестал быть ручной работой. Кластерный каталог VOD умел принять файл и отдать его плеером, но всё, что превращает залитый файл в услугу — лестница качеств под MBR, описатель SMIL, судьба оригинала, — делалось руками на каждой ноде. Теперь шаблон транскодирования закреплён за ассетом, задание рождается по коммиту заливки, исполнителя выбирает central, а результат возвращается в каталог обычным файлом. Шаблоны, задания и их прогресс живут в консоли, а не в curl. И MBR, собираемый из соседних файлов, плюс внешние субтитры, подхватываемые рядом с видео, означают, что мигрирующему клиенту не надо перепаковывать библиотеку.
Эджи стали настоящими эджами. Эдж-нода раньше раздавала только архив: лайв и перемотку до неё сознательно не пускали, потому что стрим на эдже тянул бы с ориджина вечно — независимо от того, смотрит его кто-нибудь или нет. Обе причины сняты. Стримы на эдже поднимаются по обращению зрителя и гаснут по простою, а ноды обмениваются живым потоком по нашему собственному межнодовому протоколу, а не деградируют до RTMP или SRT с лишним ремуксом. Так что вся зрительская нагрузка, включая лайв, уезжает с ноды захвата на эджи.
Что вы получаете при переходе с Flussonic Media Server на Catena
Catena устроена кластером с самого начала: вы заводите стрим, а не выбираете под него машину; архив и каталог VOD общие на кластер; всю установку видно из одного места. Это мы разобрали в 26.08, и с тех пор не изменилось. В 26.09 изменилось другое: список того, что Flussonic умел, а Catena нет, практически закончился.
- Платные каналы. DRM со SPEKE, одна зашифрованная копия на все три системы защиты.
- Встаёт за той мидлварью, которую вы уже продаёте. Catena — тот самый балансировщик, адрес которого вписывается в вашу существующую мидлварь, причём балансировка зарезервирована внутри кластера: отдельный железный балансировщик покупать и содержать не надо. Своей мидлвари ещё нет? Наша идёт в составе продукта: подписчики, пакеты, программа передач и витрина для зрителя.
- Форматы, которые вы уже принимаете и уже раздаёте. fMP4 по HLS и DASH на входе; HLS в MPEG-TS на выходе для старых приставок; DVB-субтитры, телетекст и скрытые субтитры — одной обычной дорожкой WebVTT.
- Региональные версии без региональных входов. Таймшифт-каналы из одного захвата.
- В пятнадцать раз больше записи на том же железе. Эффективность записи выросла примерно в 15 раз против Flussonic: те же серверы и те же диски принимают в пятнадцать раз больше данных — за счёт других структур хранения. Это стало возможным после переписывания ядра и снятия ограничений, которые висели в старом движке годами. Для проекта это меняет арифметику: там, где под архив набиралась стойка, теперь хватает нескольких машин.
- Миграция, которую вы делаете не в одиночку. Мастер импорта читает конфигурацию работающего Flussonic по API, показывает план до применения и отчёт после — а теперь ещё и сверяет хранилища архива источника с дисками, настроенными на нодах вашего кластера.
Вот что мы сделали для Mcaster
- SDI с карт DekTec и инвентарь карт и портов в консоли вместо набора серийников с клавиатуры.
- Приём SMPTE ST 2110 с NMOS IS-04/IS-05 и чтение MXL.
- RIST — открытый стандарт, который всё чаще стоит строкой в требованиях тендера.
- Полный контроль исходящего MPEG-TS: PID, номер программы, имя сервиса.
- Условный доступ на выходе SPTS — Simulcrypt, настраиваемый формой, а не голым JSON.
- Клиенты — кто какую доставку купил и какая из его услуг не работает прямо сейчас.
- Учётные записи администраторов, журнал изменений и свой пакет
mcaster-streamer.
Вещательные входы — все. Mcaster — головная станция: сигнал приходит со спутникового приёмника, из соседней сети, от партнёра или с собственного плейаута. Этот релиз закрывает те входы, которые были только у эрлангового Flussonic.
SDI с карт DekTec работает отдельным процессом на порт карты, общающимся со стримером через разделяемую память: отказ на уровне драйвера уносит один захват, а не медиасервер целиком — что при истории падений DTAPI не теоретическая забота. Он деэмбеддирует многоканальный звук, извлекает VANC и сам считает выровненные метки времени. В консоли теперь видно, какие карты реально стоят в машине, сколько у них портов, в каком варианте прошивки они находятся и кто из стримов их уже занял. Это не украшение: на DTA-2178 каждый канал назначается прошивкой входом или выходом, и порт, который сейчас выход, отвечает на попытку захвата «занят» — после чего инженер идёт искать посторонний процесс, которого нет.
SMPTE ST 2110 принимается целиком: видео 2110-20, звук 2110-30 и вспомогательные данные 2110-40, плюс NMOS-нода, публикующая приёмники по IS-04 и IS-05, чтобы чужой контроллер мог их коммутировать. Приём идёт в выделенном системном треде пачками пакетов: 1080i25 в 10 битах — это 130 МБ/с и около 90 тысяч пакетов в секунду на одну дорожку, и это не работа для планировщика задач общего назначения. MXL, открытый обменный слой EBU через разделяемую память, тоже читается — для установок, где соседи по конвейеру отдают сигнал так.
RIST сделан своей реализацией: приём и отдача, юникаст и мультикаст, восстановление потерь и счётчики, которыми можно доказать, что линк ведёт себя прилично. Ценность тут скорее коммерческая, чем техническая: RIST — единственный протокол надёжной доставки, изданный отраслевым органом, а не одним вендором, поэтому он появляется в требованиях тендера отдельной строкой, а ответить на такой тендер мы до сих пор не могли вовсе.
Транспортный поток, который можно сдать по договору. Исходящий MPEG-TS раньше был «бери как есть»: номер программы зашит в 1, PID выделяются автоматически, SDT не выдаётся вовсе. Теперь можно задать карту PID, номер программы и имя сервиса на каждое направление. Ближайший повод — клиент, получающий один канал от нас и от резервного провайдера, чей резерватор требует совпадения PID у двух потоков. Но того же контроля просит и мультиплекс, и IRD, и мониторинг NOC, и спецификация контрибуционного контракта.
Условный доступ. Скремблирование Simulcrypt на выходе SPTS: без карты доступа картинки нет, с картой — есть. Настраивалось это только правкой документа руками, где ошибка в одном hex-поле означает «карта молча игнорирует EMM» и стоит дней отладки на стенде, — поэтому в консоли появилась нормальная форма.
Клиенты и то, что каждый из них купил. Об этом операторы Mcaster просили прямее всего. Вы продаёте не поток, а услугу: этот канал, доставленный вот так, вот этому юрлицу. Конфигурация и мониторинг знали только про стримы, поэтому на звонок клиента смотреть было некуда — что он купил, что из этого лежит и чей это простой.
Теперь продажа записана там же, где живёт доставка. У юникастного пуша и у порта SRT есть поле владельца, а статический токен стрима позволяет выдать покупателю ссылку раз и навсегда и сшить его потребление с ним. Мультикастные пуши владельца сознательно не несут: получателей в группе много, коммутация сетевая, и одно поле такую доставку честно не описывает. Поверх этого — статистика доставки по каждому направлению: статус с названной причиной отказа, битрейт, байты, переподключения, ретрансмиты. Заодно починилась вещь похуже: падающий пуш иногда сообщал о себе как о работающем — с пустой ошибкой и растущим счётчиком переподключений, — и консоль уверяла оператора, что отдача жива, хотя не уходило ни байта.
Кто и что поменял. Central знает желаемое состояние установки — конфигурацию стримов и нод, зоны CDN, учётные записи администраторов, жизненный цикл нод — и до сих пор не записывал, кто это менял. Когда операторов несколько, инцидент от этого становится неразбираемым: на вопросы «кто удалил стрим» и «когда и кем была отозвана нода» ответа просто не было. Теперь есть: кто, что, когда.
Свой пакет и кластер, который остаётся одним продуктом. Появился пакет mcaster-streamer. До него пакет ноды существовал ровно один — от Catena, — а консоль Mcaster показывала в окне присоединения команду, зашитую на пути Catena. Оператор, который ей следовал, ставил на ноду пакет чужого продукта, и ошибки по дороге не возникало ни одной. Кластер из машин двух продуктов — не экзотика, а тихая авария, о которой узнаёшь сильно позже. Теперь подключение ноды чужого продукта отклоняется с внятной причиной.
Что вы получаете при переходе с Flussonic Media Server на Mcaster
Головную станцию оценивают по тому, что она может принять и что может доказать про отданное. Ровно туда 26.09 и попадает.
- Входы, которые стоят у вас в стойке. SDI с карт DekTec, ST 2110 с NMOS, MXL, RIST, SRT, мультикаст с указанием источника — и инвентарь карт в консоли вместо серийников, списанных с соседнего экрана.
- Транспортный поток под спецификацию. Свои PID, номер программы и SDT на каждое направление; постоянный битрейт для модулятора; телетекст и субтитры, доживающие до выхода; мониторинг TR 101 290.
- Условный доступ на выходе SPTS, настраиваемый формой.
- Доказательство доставки. По каждому направлению, с названной причиной отказа, — и падающий пуш теперь об этом говорит.
- Коммерческая картина, а не только техническая. Реестр клиентов и купленных ими услуг: у инцидента появляется владелец, а у телефонного звонка — ответ.
- Подотчётность. Учётные записи администраторов с ролями, немедленный отзыв доступа и журнал изменений конфигурации. Это пришло из требований служб безопасности заказчиков, а не из нашей фантазии.
- Плотность. То же ядро, которое держит 18 000 WebRTC-зрителей и отдаёт 100 Гбит/с HLS с одной машины, — меньше коробок на тот же сигнал.
Вот что мы сделали для Agora
Agora — это корпоративное телевидение: свои внутренние каналы, студийные сигналы, подготовленные к вещанию, общие собрания и вебинары, доставленные сотрудникам по корпоративной сети. В 26.09 у неё появляется собственное лицо на общей платформе: своя консоль, свой набор разделов, своя продуктовая принадлежность — а доменные возможности переезжают на новое ядро следующими релизами.
Два куска ядерной работы попадают ровно в её сценарий.
Раздача с низкой задержкой, которая масштабируется. Работа по WebRTC, описанная выше, — это ровно то, что нужно корпоративному вещанию: общее собрание, это несколько тысяч человек, смотрящих одно и то же одновременно, с задержкой меньше секунды, внутри одной сети. Переход с 200–300 одновременных сессий на ноду к 18 000 меняет то, во сколько компании обходится трансляция на всех, — из стойки в одну машину.
Публикация по SRT. Студия, переговорная или ноутбук с OBS теперь публикуют в кластер по SRT, приём идёт на той ноде, до которой дозвонились, с шифрованием и восстановлением потерь на входе. Это обычный способ, которым внутреннее мероприятие попадает на платформу.
Вот что мы сделали для Watcher
- Регистратор меняет медиасервер на новое ядро обычной кнопкой обновления.
- Захват камер по RTSP: 9,55% битых кадров стали 0,002%.
- Десять тысяч камер пишутся с медианой потерь 2 фрагмента в секунду вместо 15 236.
- Регистратор стал источником правды по своим камерам, а облако — пультом, а не перезаписывателем.
- API v2 выключен, на переходный период оставлен флаг — и мы поможем переехать.
- В новом плеере появились календарь, переключение качества, экспорт отрезка и мозаики; на регистраторах он теперь по умолчанию.
Регистратор переезжает на новое ядро, и инженер для этого не нужен. В 26.08 медиаслой получил собственное имя — пакет watcher-streamer, — за которым можно было поменять движок. В этом релизе движок меняется, и меняется по единственному каналу, который у регистратора в поле реально есть: по кнопке обновления в облаке.
До сих пор смена медиасервера на регистраторе означала инженера по ssh, запускающего скрипт миграции: тот снимал раскладку дисков, рендерил конфигурацию и правил стек контейнеров на месте. До коробок клиентов такое не доезжает никогда. Теперь новый медиасервер едет тем же путём, что и всё остальное: нажали обновление — регистратор забрал новый стек, а отказ на любом шаге откатывает его на прежний автоматически. Пер-боксовые значения, из-за которых это было сложно — ключ кластера, учётные данные админки, имя стримера, раскладка архивных дисков, — теперь собираются на самой коробке, а не запекаются в файл, который раздаётся всей флотилии по публичному адресу.
Что вы за это получаете — плотность. Новое ядро пишет двадцать гигабит в секунду на сервер, и по мере переезда мы ожидаем кратного сокращения ресурсов на ту же установку: меньше машин на то же число камер, меньше места в стойке, меньше счёт за электричество.
Захват камер стал заметно надёжнее, и нашли мы это случайно. Гоняясь за потерями записи на регистраторе с десятью тысячами стримов, мы заметили, что часть стримов даёт фрагменты в десять раз мельче остальных, полезли смотреть камеру — и камера оказалась исправна. Проблема была в том, как мы собирали фрагментированные RTP-пакеты в кадры на тракте приёма RTSP.
Замеры говорят сами за себя. На той же камере и том же стенде июльская сборка давала 438 453 битых кадра на 4 600 555 — это 9,55%. После правки: 6 ошибок на 272 591 кадр, 0,002%. На принимающем регистраторе, где час крутились 10 000 стримов, медиана потерь архива упала с 15 236 до 2 фрагментов в секунду, а число стримов, теряющих хоть что-то, — с 2815 до 2.
Если у вас камеры по RTSP — то есть если у вас камеры, — это самая ценная строчка релиза.
Запись перестала выбрасывать данные при свободной памяти. Закрытый фрагмент жил ровно в одном месте, и окно раздачи вытесняло фрагменты по числу штук. Отстал таск записи на несколько фрагментов — данные потеряны навсегда. На регистраторе с девятью тысячами камер это 898 501 потерянный фрагмент за десять минут, притом что свободными оставались 42 ГБ из 125. Теперь у раздачи и у записи разные бюджеты: очередь записи держит собственные ссылки на данные и ограничена в байтах, а фрагмент может потеряться только тогда, когда память действительно кончилась. Попутно выравнивание дозаписи по границе 4 КБ само по себе снизило потери с 5524 до 8.
Регистратор владеет своими камерами. Конфигурация синхронизировалась двумя несимметричными каналами, и оба били по живым людям: камера, созданная на регистраторе, не появлялась в облаке, пока человек не найдёт кнопку «синхронизировать», а фоновый забор конфигурации из облака раз в шестьдесят секунд молча перезаписывал локальные правки. Архитектура теперь названа прямо: регистратор — единственный источник правды по конфигурации своих камер, облако — недеструктивное зеркало. Пока связь есть, править из облака можно; пока связи нет — нельзя, вместо того чтобы делать правки, которые потом тихо пропадут.
API v2 выключен. В 26.08 мы сказали, что выключим, — и выключили: ручки v2 отвечают заглушкой с предупреждением. Поскольку мы знаем, что часть биллингов ещё на нём, в конфигурации остался флаг, которым v2 включается обратно на переходный период. Считайте это сроком, а не отсрочкой.
Всё, что было в v2, уже есть в v3. Из опыта тех, кто пробовал переезжать, мы поняли, что дело не в отсутствующей ручке, а в отсутствующем сценарии: создание пользователя, организации и папки — это цепочка вызовов, где каждый идентификатор берётся из ответа предыдущего, и пропущенный шаг даёт либо 403, либо абонента с правами администратора. Поэтому мы пишем инструкцию «как перейти на v3» для интеграций с биллингом. Если у вас своя интеграция на v2 — напишите нам, разберём ваши вызовы вместе.
Новый плеер и остальное. В плеере появились календарь, переключение качества, выделение отрезка на таймлайне с экспортом выбранного интервала, поддержка мозаик и отладочная панель, отделённая от самого плеера; на регистраторах он теперь стоит по умолчанию. Рядом: список организаций пользователя показывается целиком, а не урезанным; окно с информацией об архиве показывает настоящие числа; на странице мозаик починены пагинация и удаление; прогноз использования диска, который central на самом деле посчитать не может, убран, а не оставлен вводить в заблуждение; а планировщик, молча перестававший выполнять всю периодику после рестарта Redis, теперь это замечает и восстанавливает расписание сам.
«Сторожка». Продукт для пропусков в посёлках, построенный на Watcher, в этом релизе повзрослел. Жители сгруппированы в участки, а не существуют по отдельности, — поэтому ограничение «с этого участка гостевые пропуска не выписываются» вешается туда, где ему место. Житель входит по номеру телефона и коду из СМС, а не по почте и паролю, которых ему никто не выдавал. Открывашка отчитывается о проездах: какая машина проехала, когда, в какую сторону и по какому пропуску, — и на эти данные наконец появился экран: лента проездов с поиском по номеру и по пропуску. Председатель может переключаться между своими пропусками и пропусками всего общества, а не видеть чужие по умолчанию. А в админке оператора появился продуктовый срез по каждому посёлку — жители, участки, выписанные за неделю пропуска и давность последнего обмена с открывашкой — вместо голого списка названий.
Flussonic Media Server
Нового ничего, и это осознанно. Как мы сказали в 26.08, фаза активного развития Flussonic Media Server закончена: продукт остаётся поддержанным, минимальные обновления безопасности мы выпускаем, но новых возможностей в нём не будет — вся разработка идёт в продукты на новом ядре.
Этот релиз — хороший момент начать планировать переход, потому что поводов ждать почти не осталось. Если вы занимаетесь телевидением и OTT — это Catena, у которой с 26.09 есть DRM, программа передач, своя мидлварь — если она вам нужна, таймшифт-каналы, захват fMP4 по HLS и DASH, выдача MPEG-TS для старых приставок и инструмент, читающий ваш существующий архив на месте. Если у вас головная станция — это Mcaster: SDI, ST 2110, MXL, RIST, полный контроль PSI/SI и условный доступ. Если вы занимаетесь видеонаблюдением — это Watcher, регистраторы которого начали переезжать на новое ядро прямо в этом релизе.
Миграция — это больше, чем инструмент, поэтому мы участвуем в ней сами: расскажите про свою установку, и мы вместе решим, что переезжает первым и как по дороге проверяется эфир.