Приём ST 2110¶
ST 2110 — это студийный сигнал в IP-сети: несжатое видео, звук и вспомогательные данные едут отдельными мультикаст-группами, а связывают их общие часы PTP. Mcaster принимает такой сигнал как обычный источник стрима: дорожки приходят в тракт, перекодируются, пишутся в архив и уходят на выход теми же средствами, что сигнал со спутника или из SRT.
Одна деталь отличает 2110 от всех прочих входов, и с неё начинается настройка: источник здесь не один адрес, а набор дорожек. Видео, звук и вспомогательные данные — три разные группы с тремя разными наборами параметров, и стрим собирается из них, а не из одного URL.
Что должно быть верно в сети¶
Несжатый поток — это единицы гигабит в секунду, и сеть под него готовят до того, как открывают панель.
- Полоса на каждый поток. 1080p60 с глубиной 10 бит — это около 2,5 Гбит/с и 260 тысяч пакетов в секунду. На интерфейсе 10 Гбит/с помещаются три таких потока, а не четыре: остаток нужен всплескам.
- Порт выбирает оператор, а не станция. Подписка уходит через тот интерфейс, который назван в настройке входа, и коммутатор доставит группу именно в него. Названный порт с недостаточной полосой — самый частый диагноз: поток «идёт», а картинка сыплется, потому что рубит коммутатор, и счётчики самой машины при этом чисты.
- PTP обязателен. Часы 2110 приходят из домена PTP, и по ним же станция сверяет свою шкалу времени. Разъехавшиеся часы видны в статусе стрима отдельно от ошибок приёма — это не одно и то же.
- Мультикаст и IGMPv3. Группы доставляются подпиской станции; когда в группу вещают несколько отправителей, а нужен один, его адрес задаётся в поле Источник (SSM).
Подключите дорожки¶
Создайте стрим и на вкладке Источники нажмите + Добавить источник. Протокол — ST 2110.

Поля входа целиком:
- Интерфейс — имя порта (
dpdk0) или его адрес. Значения «любой» здесь нет намеренно: интерфейс решает, куда коммутатор доставит группу. - Адресация — кто даёт дорожкам адреса. Про неё следующий раздел.
- Понижать 10 бит до 8 при приёме — экономит полосу до транскодера ценой двух младших бит. По умолчанию выключено.
Приёмные дорожки объявляет сам вход: видео, звук и вспомогательные данные показаны всегда, и роль у них не спрашивают. Контроллер видит ровно эти три приёмника и приносит им адреса. В конфигурации такой дорожки нет, пока про неё нечего сказать.
Дорожек одного рода может быть больше: вторая звуковая под другой язык заводится кнопкой Добавить дорожку в блоке Добавленные дорожки. Там роль (audio 2) придумываете вы, и род приходится назвать явно — из свободной строки его не вывести. Правка роли применяется по уходу фокуса.
Флажок Принимать есть у каждой дорожки: снятый оставляет её в конфигурации со всеми параметрами, но сокет не открывается.
Не забудьте Сохранить: правка входа уезжает на сервер только по кнопке.
Два способа адресации¶
Способ выбирается полем Адресация и действует на весь вход, а не на отдельную дорожку: сеть либо управляется контроллером, либо нет, и дорожка, скоммутированная контроллером, рядом с набранной руками — не сценарий, а недоразумение, которое пришлось бы отлаживать.
- Контроллер (IS-05) — основной путь. Оператор включает вход и называет интерфейс, а откуда принимать, говорит контроллер, и сразу по всем дорожкам.
- Вручную — то же самое, проделанное руками: адрес и формат каждой дорожки набирает оператор. Нужно там, где контроллера нет, и на проверках.
Транспортного файла в этом списке нет намеренно. SDP присылает контроллер, и это описание уже сделанного подключения, а не способ его задать: руками SDP не пишут. Скоммутированная дорожка подписана строкой Скоммутировано контроллером с идентификатором сендера, а под ней лежит Транспортный файл — только для чтения. Это диагностика, ответ на вопрос «откуда сейчас идёт приём», а не поле ввода.
Ручная адресация выглядит так:

Адрес без формата станция отвергает, и это не придирчивость: у несжатого медиа нет своей геометрии внутри потока. Пакет 2110-20 не несёт ни размера кадра, ни частоты, ни субдискретизации — приёмник обязан знать их заранее, иначе разбирать строки не по чему. Отсюда и набор полей: Ширина, Высота, Битность, Субдискретизация, Частота кадров, Чересстрочная развёртка, Передача полями (segmented).
Частота записывается дробью, как в SDP: 60000/1001, а не 59.94. Округление здесь не мелочь — по нему нельзя восстановить сетку меток времени.
Из схем субдискретизации в тракт сейчас доезжает YCbCr 4:2:2 с глубиной 8 или 10 бит. Остальные — 4:2:0, 4:4:4, RGB — разбираются и раскладываются по пикселям, но кадра из них не собирается: дорожка останавливается, а причина называет схему и глубину.
Два поля чересстрочного кадра станция склеивает сама; деинтерлейс остаётся работой транскодера.
Коммутация контроллером NMOS¶
Ручная адресация — запасной путь. Станция умеет то, что от неё ждёт студийная инфраструктура: объявляется контроллеру по IS-04 и отдаёт ему коммутацию своих приёмников по IS-05. Контроллер записывает транспортный файл в дорожку сам — это та же правка конфигурации, которую сделал бы оператор.
Объявление настраивается в параметрах ноды, секция NMOS:

- Интерфейс — объявляемый порт. Пустое поле означает, что NMOS выключен и в реестре нода не появляется вовсе.
- Устойчивое имя — из него выводятся идентификаторы ресурсов; пусто — имя хоста. Меняете его — у ноды меняются все идентификаторы, и контроллер видит новое устройство.
- Метка — то, что видно в контроллере.
- Где слушают ручки NMOS этой ноды — Отдельный порт и интерфейс (рекомендуется) или Общий HTTP-порт ноды. Отдельный задаётся полями Интерфейс ручек (контрольная сеть; пусто — медийный интерфейс) и Порт ручек (по умолчанию 8090).
Выбор здесь не про удобство, а про доступ: активация IS-05 не аутентифицируется, и на общем порту ручки появляются на всех HTTP-портах ноды, включая публичные. Ограничить, кто до них дотянется, сможет только сеть — поэтому отдельный порт в контрольной сети и рекомендуется.
Активацию обслуживает тот, кто владеет конфигурацией: для ноды под управлением кластера — сам кластер (в его настройках это секция NMOS (ST 2110) с флажком Включить коммутацию через central), для автономной коробки — она сама. Настраивать это на стороне ноды нечего.
Про приёмники важно знать одно: свободных приёмников у ноды не бывает. Контроллер видит ровно те, что выведены из стримов, и активация стрима не создаёт. Поэтому стрим под коммутацию заводят заранее — с входом ST 2110 в режиме Контроллер (IS-05), где адресов у дорожек ещё нет. Пока стрима нет, контроллеру нечего коммутировать.
Скоммутированная дорожка подписана в форме: Скоммутировано контроллером с идентификатором сендера. Строку заполняет контроллер, править её нельзя.
Реестр (registry) станция ищет сама и, найдя, регистрируется в нём и поддерживает регистрацию сердцебиением. Реестра в сети нет — работает напрямую с контроллером, режимом peer-to-peer.
Что приходит в стрим¶
Стрим стартует, как только пошла первая дорожка, и не ждёт остальных. Состояние приёма видно на вкладке Источники, в блоке Здоровье источников:

В карточке — статус, адрес входа, состав дорожек и битрейт приёма. Числа на снимке настоящие: 2501 Мбит/с — это одна дорожка 1080p60 с глубиной 10 бит плюс шестнадцать каналов звука L24.
Состав дорожек показан на вкладке Основные настройки, в блоке Что в потоке:

Кодек называет проводную раскладку, а не то, во что поток превратится: yuv422p10st для 10-битного видео и l24 для звука. Каналы станция не сводит — принимает столько, сколько объявил отправитель, и отдаёт их одной дорожкой.
Сырой поток нужно перекодировать¶
Стрим с одним лишь входом 2110 — рабочее состояние, а не поломка: он поднимается, принимает данные и отдаёт кадры подписчикам. Но сегментации в нём нет, и мастер-плейлист приходит без единой дорожки: сырую дорожку в него не положить — плеер сломался бы на разборе её кодека вместо честного «нечего играть».
Поэтому рядом с составом дорожек панель предлагает ссылку Перекодировать, чтобы играло в вебе: она открывает вкладку Транскодер с готовой ступенью. После неё стрим играет, пишется в архив и уходит в пуши как любой другой.
Признак сырого тракта и неактивной сегментации виден в статусе стрима отдельно — чтобы это состояние не путали с неисправностью.
Скриншоты сырого потока работают без транскодера: превью снимается прямо с сырой дорожки, в том числе в архив.
Вспомогательные данные и субтитры¶
Дорожка рода вспомогательные данные (2110-40) принимается и разбирается по парам DID/SDID. Что происходит дальше, зависит от вида данных:
- Телетекст OP-47 доезжает до стрима дорожкой телетекста — той же самой, какую даёт телетекст из MPEG-TS.
- Кэпшны CEA-708/608 разбираются, и счётчик по их паре DID/SDID растёт, но субтитровой дорожки у стрима не появляется: место таких кэпшнов — внутри кодированного видео, и доставка их на выход в станцию пока не входит.
- Неизвестные пары учитываются счётчиком и отбрасываются: дорожкой «сырые вспомогательные данные» наружу не идут.
Пакет с непройденной контрольной суммой отбрасывается со счётчиком; нарушенная чётность считается, но пакет не выбрасывает.
Тонкая настройка¶
Обычно не нужна: пустое поле означает умолчание станции, а не «выключено». Живёт в двух свёрнутых блоках.
Тонкая настройка дорожки — то, что принадлежит одной группе:
- Ядро CPU — прибивает приёмный тред дорожки к ядру. У каждой дорожки тред свой, поэтому и поле у каждой своё. Пусто — на усмотрение планировщика.
- Очередь AF_XDP — очередь карты, которую дорожка забирает себе в обход обычного сокета. Пусто — обычный сокет.
Тонкая настройка входа — то, что общее:
- Буфер сокета (байт) — сколько ядро держит в приёмном буфере каждого сокета.
- Очередь кадров (байт) — порог очереди одной дорожки между приёмом и трактом. При переполнении лишнее отбрасывается со счётчиком: приём не встаёт.
- Звуковой кадр (мс) — крупность звуковых сообщений. Меньше — ниже задержка и больше сообщений.
Что поддержано¶
| Возможность | Состояние |
|---|---|
| Видео 2110-20: YCbCr 4:2:2 с глубиной 8 и 10 бит | есть |
| 10 бит сохраняются в проводной раскладке, без понижения | есть |
| Прочие схемы 2110-20: 4:2:0, 4:4:4, RGB | нет, разбираются, но кадра не дают — причина называет схему |
| Чересстрочная развёртка: два поля склеиваются в один кадр | есть |
| Передача полями (segmented) | флажок принимается, но на приём пока не влияет |
Звук 2110-30: L16 и L24, произвольное число каналов, ptime из SDP |
есть |
| Вспомогательные данные 2110-40: депакетизация, контрольная сумма, счётчики | есть |
| Телетекст OP-47 дорожкой телетекста | есть |
| Кэпшны CEA-708/608 | разбираются и считаются, дорожкой не отдаются |
| Адресация транспортным файлом (SDP), присланным контроллером | есть |
| Подписка на конкретного отправителя (SSM, IGMPv3) | есть |
| Несколько дорожек одного рода в одном входе | есть |
| NMOS IS-04: объявление ноды, mDNS, регистрация в реестре | есть |
| NMOS IS-05: коммутация приёмников контроллером | есть |
| Поиск чужих сендеров самой станцией | нет, адрес приносит контроллер или оператор |
| SDP с несколькими медиа-строками в одной дорожке | нет, один блок адресации описывает одну дорожку |
| Выход в 2110 (станция как отправитель) | нет |
Применение изменений¶
Смена группы, порта, отправителя или транспортного файла пересоздаёт сокет с новой подпиской — приём по этой дорожке прерывается, остальные продолжают идти. Поля, не влияющие на приём, применяются на лету.
Проверка¶
Проверять стоит в таком порядке, потому что каждый следующий шаг имеет смысл только при пройденном предыдущем:
- Пакеты долетают —
tcpdump -i <интерфейс> host <группа>на самой машине станции. Проверка с соседней машины на этот вопрос не отвечает: доставку группы решает подписка, а её сделала станция. - Дорожки поднялись — карточка в блоке Здоровье источников показывает состав и битрейт приёма.
- Часы не разъехались — расхождение часов в статусе стрима. Без синхронизации встают архив и перемотка, и лечится это в домене PTP, а не в настройке входа.
- Картинка та, что ожидали — превью стрима: геометрия и субдискретизация в ручной адресации задаются руками, и ошибка в них даёт разъехавшиеся строки, а не отказ приёма.
Скрипт для стенда без контроллера¶
На стенде контроллера NMOS обычно нет, а адреса групп нужны: у большинства отправителей они меняются от активации к активации, и вписать их однажды нельзя.
Для этого случая приложен небольшой скрипт — nmosctl.py. Ему нужен только Python 3; зависимостей нет, для поиска нод используется avahi-browse.
python3 nmosctl.py discover # ноды в сети (mDNS)
python3 nmosctl.py list 10.0.0.90:8090 # устройства, сендеры, приёмники
python3 nmosctl.py enable 10.0.0.90:8090 <sender> # включить сендер
python3 nmosctl.py sdp 10.0.0.90:8090 <sender> # его транспортный файл
Текст, который отдаёт sdp, — это то, что приносит контроллер при коммутации: на стенде он нужен, чтобы проверить ручную адресацию, и из него переписывают группу, порт и формат.
Две вещи, на которых спотыкаются чаще всего:
- Пока сендер не включён, транспортного файла нет —
sdpотвечает ошибкой, потому что адрес группы появляется только при активации. - Адрес меняется при каждой активации. Брать его надо заново, а не из своих записей: подписка на прежнюю группу молча даёт ноль пакетов.
Что дальше¶
- Перекодировать поток — ступень, после которой сырой сигнал играется и пишется.
- Зарезервировать вход — второй источник и правила переключения.
- Ошибки входа — что означают счётчики, когда сигнал сыплет.
- Отдать сигнал обратно в сеть.