Skip to content

Приём ST 2110

ST 2110 — это студийный сигнал в IP-сети: несжатое видео, звук и вспомогательные данные едут отдельными мультикаст-группами, а связывают их общие часы PTP. Mcaster принимает такой сигнал как обычный источник стрима: дорожки приходят в тракт, перекодируются, пишутся в архив и уходят на выход теми же средствами, что сигнал со спутника или из SRT.

Одна деталь отличает 2110 от всех прочих входов, и с неё начинается настройка: источник здесь не один адрес, а набор дорожек. Видео, звук и вспомогательные данные — три разные группы с тремя разными наборами параметров, и стрим собирается из них, а не из одного URL.

Что должно быть верно в сети

Несжатый поток — это единицы гигабит в секунду, и сеть под него готовят до того, как открывают панель.

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

Подключите дорожки

Создайте стрим и на вкладке Источники нажмите + Добавить источник. Протокол — ST 2110.

Вход 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 выключен и в реестре нода не появляется вовсе.
  • Устойчивое имя — из него выводятся идентификаторы ресурсов; пусто — имя хоста. Меняете его — у ноды меняются все идентификаторы, и контроллер видит новое устройство.
  • Метка — то, что видно в контроллере.
  • Где слушают ручки NMOS этой нодыОтдельный порт и интерфейс (рекомендуется) или Общий HTTP-порт ноды. Отдельный задаётся полями Интерфейс ручек (контрольная сеть; пусто — медийный интерфейс) и Порт ручек (по умолчанию 8090).

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

Активацию обслуживает тот, кто владеет конфигурацией: для ноды под управлением кластера — сам кластер (в его настройках это секция NMOS (ST 2110) с флажком Включить коммутацию через central), для автономной коробки — она сама. Настраивать это на стороне ноды нечего.

Про приёмники важно знать одно: свободных приёмников у ноды не бывает. Контроллер видит ровно те, что выведены из стримов, и активация стрима не создаёт. Поэтому стрим под коммутацию заводят заранее — с входом ST 2110 в режиме Контроллер (IS-05), где адресов у дорожек ещё нет. Пока стрима нет, контроллеру нечего коммутировать.

Скоммутированная дорожка подписана в форме: Скоммутировано контроллером с идентификатором сендера. Строку заполняет контроллер, править её нельзя.

Реестр (registry) станция ищет сама и, найдя, регистрируется в нём и поддерживает регистрацию сердцебиением. Реестра в сети нет — работает напрямую с контроллером, режимом peer-to-peer.

Что приходит в стрим

Стрим стартует, как только пошла первая дорожка, и не ждёт остальных. Состояние приёма видно на вкладке Источники, в блоке Здоровье источников:

Здоровье источника ST 2110

В карточке — статус, адрес входа, состав дорожек и битрейт приёма. Числа на снимке настоящие: 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 отвечает ошибкой, потому что адрес группы появляется только при активации.
  • Адрес меняется при каждой активации. Брать его надо заново, а не из своих записей: подписка на прежнюю группу молча даёт ноль пакетов.

Что дальше