Приём SDI¶
Обзор¶
Вход SDI захватывает видео и звук с SDI-портов карт DekTec. Сигнал заходит в систему только проводом в порт карты, и что стоит на другом конце провода — аппаратная, видеокоммутатор, спутниковый приёмник — входу безразлично. Карты, кроме DekTec, не поддерживаются.
Поддерживаемые карты и стандарты¶
Поддерживаются карты DekTec. Проверка идёт на DTA-2178 (HD и 12G вплоть до 3840×2160p50) и DTA-2174B (HD). Другие карты DekTec на том же драйвере не проверялись.
Стандарт сигнала определяет сама карта, и вход не различает SD, HD, 3G и 12G-SDI: наверх приезжают кадры со своим самоописанием — размер, развёртка, частота рациональным числом. Смена стандарта на линии — штатный рестарт захвата, а не ошибка: так выглядит переключение на видеокоммутаторе.
Раскладку портов карты задаёт вариант её прошивки, а не номер порта. Что за карты стоят в машине, какие у них порты и что на них за сигнал, показывает раздел Карты захвата.
Карты Blackmagic (DeckLink), Magewell и прочие V4L-совместимые этим входом не поддерживаются.
Настройка входа¶
На стримере с картой должен стоять пакет dektec-bridge: он приносит процесс захвата и опросчик карт. Без него вход отказывает с причиной «процесс захвата недоступен», см. ниже.
Создайте стрим и на вкладке Источники нажмите + Добавить источник. Протокол — SDI (DekTec).

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

В списке портов — все порты парка, в которые можно подключить кабель, сгруппированные по картам: выбранная карта первой, за ней остальные. В список не попадают три вида портов, снимать с которых нечего:
- генлок — опорный вход;
- виртуальный порт — разъёма нет вовсе;
- внутренний выход — прошивка развела порт на соседний порт той же карты.
Строка из группы другой карты меняет и карту, и порт разом: перевесить вход на соседнюю карту можно одним выбором.
Порт вывода в списке остаётся с подписью «не вход»: карта не всегда верно сообщает направление, и разъём, который есть на планке, лучше показать с подписью, чем спрятать. Выбор такого порта даст отказ «порт занят», см. ниже.
Занятый порт подписан стримом, который его занял, а если процесс захвата этого стрима завис, то и состоянием: «Стрим: tv1 · держит зависший процесс». Так заклинивший порт отличается от нормально занятого.

Список — подсказка, а не ограничение: серийный номер и порт можно ввести вручную, и форма примет и неизвестный номер, и порт вывода. Это нужно, когда карта ещё не установлена или стоит на другом стримере: список карт обновляется раз в минуту и может отставать. Если списка нет вовсе (стример молчит или опросчик не установлен), поля работают как обычные текстовые.
Остальные поля секции:
| Поле | Значение |
|---|---|
| Пиксель-формат | uyvy422 (8 бит, умолчание) или v210 (10 бит). Десять бит стоят вдвое большей полосы во внутреннем тракте и примерно на треть большей — по шине PCIe |
| Таймаут открытия, мс | сколько ждать кадров, прежде чем признать источник мёртвым; он же окно тишины сокета. Пусто — 30 с |
| Дорожка меток SCTE-104 | включена по умолчанию, см. ниже |
| Звуковые дорожки | карта эмбеддированного звука, см. ниже |
Не забудьте Сохранить: правка входа уезжает на сервер только по кнопке.
Один порт нельзя назначить двум стримам: конфигурация отклоняется, а в ошибке назван стрим, который порт уже занял. Разные порты одной карты работают независимо: эксклюзивность драйвера действует на порту, а не на карте.
Сырое видео с карты играть нечем: пока в стриме нет кодированных дорожек, HLS, DASH и архив останутся пустыми. Чтобы они заполнились, включите транскодер.
Состав дорожек показан на вкладке Основные настройки, в блоке Что в потоке:

Кодек называет проводную раскладку, а не то, во что поток превратится: v210 — сырое видео с выбранным пиксель-форматом, s32p — несжатый 32-битный звук, scte104 — дорожка меток. Ссылка Перекодировать, чтобы играло в вебе ведёт в настройки транскодера.
Многоканальный звук¶
Звук приезжает уже разложенным по дорожкам: карту дорожек объявляет секция входа, а деэмбеддированием занимается процесс захвата. Позиция дорожки в списке — её номер в стриме (a1, a2, …).
У дорожки три поля:
- каналы SDI — номера от 1 до 16: в SDI не больше восьми пар, то есть шестнадцати каналов. Порядок номеров задаёт раскладку каналов в дорожке;
- транспорт — несжатый звук или обёртка SMPTE 337: сжатый звук, например AC-3 или Dolby E, упакованный в пару PCM-каналов;
- язык — по ISO 639-2.
Язык объявляется, а не выводится из сигнала: языковых дескрипторов SDI не несёт, и знает язык только тот, кто раскладывал программы по парам.
Пустой список дорожек означает не «звука нет», а умолчание: одну стереодорожку PCM из первой пары.
Несжатый звук приходит 32-битным и декодируется по объявленному числу каналов. Дорожка шире стерео принимается честно, но кодер сводит её в стерео — это граница транскодера, а не входа.
Bypass AC-3 по SMPTE 337¶
Дорожка с транспортом smpte337 приезжает готовыми кадрами AC-3 или E-AC-3: обёртку снимает процесс захвата, медиасервер битовый поток звука не разбирает и не декодирует. Поддерживается единственный вариант — SMPTE 337, закодированный в двух каналах: такая дорожка обязана объявлять ровно два канала, иначе конфигурация отклоняется.
Так 5.1 доезжает до выдачи целым. Паузы сжатой дорожки — тишина между пакетами — законны и ошибкой не считаются.
Вид звука объявляется, а не распознаётся по данным: пара, в которой сегодня AC-3, а завтра тишина, не должна менять состав дорожек стрима.
Телетекст и субтитры¶
Вспомогательные данные приезжают в VANC каждого кадра, служебной области над изображением, и вход разводит их по назначению.
Телетекст OP-47 попадает в общий тракт closed captions — тем же путём, что OP-47 из ST 2110, и с тем же результатом: телетекст и субтитры доезжают до выдачи.
VBI-телетекст важен для унаследованных SD-систем вещания. В SD телетекст едет не пакетом ANC, а строкой гашения — областью, в которой изображение не передаётся. Вход отправляет такие строки в тот же тракт, что и OP-47, и на выходе они становятся тем же телетекстом. Настраивать здесь нечего.
Closed captions CEA-608/708 (CDP) вход разбирает и считает счётчиком, но отдельной дорожкой пока не публикует: носитель closed captions в тракте — SEI кодированного выхода, и вставка туда общая для всех входов и ещё не сделана. Счётчик существует затем, чтобы «closed captions в сигнале нет» и «closed captions некуда отдать» не выглядели снаружи одинаково.
Метки SCTE-104¶
Пакеты SCTE-104 из VANC уезжают отдельной прикладной дорожкой — сырыми, со штампом несущего кадра. Вход их содержимое не разбирает и в SCTE-35 не преобразует: обработки меток — замены, компенсации, вставки — в Mcaster пока нет.
Дорожка включена по умолчанию и существует с первого кадра, даже пока меток нет. Если бы она появлялась с первой меткой, состав дорожек менялся бы в начале рекламного блока и упаковка перезапускалась бы. Так же устроен MPEG-TS: PID меток объявлен в таблице задолго до первого сообщения. Цена умолчания — одна пустая дорожка в стримах без меток.
Что видно, когда что-то не так¶
Состояние входа видно на вкладке Источники, в блоке Здоровье источников.

В блоке — статус, адрес входа вида sdi://<серийный номер>/<порт> и состав дорожек. При отказе вместо «Работает» стоит причина из таблицы ниже, и у каждой причины своё действие:
| Причина | Что случилось | Что делать |
|---|---|---|
| нет сигнала | на порту нет детектируемого сигнала | проверить кабель и источник |
| порт занят | драйвер отказал в порте | 1) посмотреть направление порта в разделе Карты захвата: порт вывода отвечает тем же кодом; 2) проверить, не завис ли свой процесс захвата; 3) только потом искать посторонний процесс |
| процесс захвата недоступен | исполняемый файл не найден или не запускается | поставить пакет dektec-bridge |
| отказ устройства | процесс захвата вышел ненулевым кодом без отдельного значения: неизвестный серийный номер, порт без нужной способности, отказ настройки | стадию называет стартовое событие в логе |
| процесс не убивается | не завершается ни по закрытию стандартного ввода, ни по SIGKILL |
признак заклинившей карты; разбираться на хосте |
| процесс убит извне | захват убил OOM-killer, systemd или человек | выяснить, кто завершил процесс, а не чинить стрим |
| рассинхрон версий | процесс захвата шлёт данные, но медиасервер их не разбирает | версии dektec-bridge и медиасервера разъехались; выкатывать их надо вместе |
Неустранимых отказов здесь нет: после любой из них вход пробует подняться снова, с растущим интервалом между попытками, и поднимается сам, как только причина исчезает.
Отдельно стоит потеря сигнала на лету. Процесс захвата при этом не выходит: он продолжает выдавать кадры по расписанию, повторяя последний кадр и тишину, и для проверки живости источник с оборванным кабелем выглядит идеально здоровым. Поэтому вход, увидев устойчивое «сигнала нет», перестаёт отдавать кадры — иначе стоп-кадр уходил бы в эфир, пока кто-нибудь не вмешается. Дальше подхватывает резервный источник, а очередной ретрай поднимает захват, как только сигнал вернётся.
Панель показывает текущую причину, а не историю. Историю дают счётчики в Prometheus с префиксом stream_input_sdi_. Всегда есть:
- состояние линии;
- рестарты процесса захвата;
- потери на границе процессов, с обеих сторон границы.
С лицензионной опцией «расширенные счётчики» добавляются обрезанные и неразобранные пакеты от процесса захвата и разбивка VANC.
Что модуль не делает¶
- Не отдаёт сигнал в карту: это вход, а выдачи в SDI в Mcaster пока нет.
- Не декодирует AC-3 и Dolby E в PCM.
- Не преобразует SCTE-104 в SCTE-35.
- Не публикует дорожку closed captions CEA-608/708.
- Не наблюдает здоровье карты: температуру, обороты и раскладку портов показывает раздел Карты захвата.
Что дальше¶
- Перекодировать поток — ступень, после которой сырой сигнал играется и пишется.
- Карты захвата — что стоит в машинах и что на портах.
- Зарезервировать вход — второй источник и правила переключения.
- Ошибки входа — что означают счётчики, когда сигнал сыплет.