Skip to content

Приём 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).

Секция SDI-входа в карточке стрима

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

Выбор карты из списка

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

  • генлок — опорный вход;
  • виртуальный порт — разъёма нет вовсе;
  • внутренний выход — прошивка развела порт на соседний порт той же карты.

Строка из группы другой карты меняет и карту, и порт разом: перевесить вход на соседнюю карту можно одним выбором.

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

Занятый порт подписан стримом, который его занял, а если процесс захвата этого стрима завис, то и состоянием: «Стрим: tv1 · держит зависший процесс». Так заклинивший порт отличается от нормально занятого.

Выбор порта

Список — подсказка, а не ограничение: серийный номер и порт можно ввести вручную, и форма примет и неизвестный номер, и порт вывода. Это нужно, когда карта ещё не установлена или стоит на другом стримере: список карт обновляется раз в минуту и может отставать. Если списка нет вовсе (стример молчит или опросчик не установлен), поля работают как обычные текстовые.

Остальные поля секции:

Поле Значение
Пиксель-формат uyvy422 (8 бит, умолчание) или v210 (10 бит). Десять бит стоят вдвое большей полосы во внутреннем тракте и примерно на треть большей — по шине PCIe
Таймаут открытия, мс сколько ждать кадров, прежде чем признать источник мёртвым; он же окно тишины сокета. Пусто — 30 с
Дорожка меток SCTE-104 включена по умолчанию, см. ниже
Звуковые дорожки карта эмбеддированного звука, см. ниже

Не забудьте Сохранить: правка входа уезжает на сервер только по кнопке.

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

Сырое видео с карты играть нечем: пока в стриме нет кодированных дорожек, HLS, DASH и архив останутся пустыми. Чтобы они заполнились, включите транскодер.

Состав дорожек показан на вкладке Основные настройки, в блоке Что в потоке:

Дорожки стрима с SDI-входа

Кодек называет проводную раскладку, а не то, во что поток превратится: 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 из MPEG-TS, и уезжают отдельной дорожкой меток. На выходе MPEG-TS они становятся секциями SCTE-35, в HLS и DASH — тегами и событиями, см. Метки рекламы.

Дорожка включена по умолчанию и существует с первого кадра, даже пока меток нет. Если бы она появлялась с первой меткой, состав дорожек менялся бы в начале рекламного блока и упаковка перезапускалась бы. Так же устроен MPEG-TS: PID меток объявлен в таблице задолго до первого сообщения. Цена умолчания — одна пустая дорожка в стримах без меток.

Время по таймкоду

Аппаратная ставит на каждый кадр таймкод — время суток в пакете ATC (SMPTE ST 12-2) в VANC. Вход умеет вести время потока по нему: штамп кадра становится временем суток из таймкода, дата берётся с часов сервера. Тогда архив, плейлисты и метки идут временем аппаратной, а не моментом, когда кадр дошёл до сервера.

Включается это флажком Время по таймкоду SDI в секции входа; по умолчанию он отмечен.

Флажок таймкода в секции SDI-входа

Таймкод используется, только если ему можно верить:

  • он расходится с часами сервера не больше чем на 30 секунд — таймкод от начала материала или в местном поясе остаётся без внимания;
  • на 29.97 и 59.94 он идёт с пропуском кадров (drop-frame), иначе за час уезжает на 3,6 секунды;
  • частота не 23.98 — у неё пропуска кадров нет вовсе.

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

Чьё время у потока сейчас, видно на вкладке Основные настройки, под статусом стрима:

Время потока под статусом стрима

  • Время потока: от входа — таймкод защёлкнулся, время идёт им;
  • Время потока: часы сервера — таймкода нет, он выключен или ему нельзя верить.

Строка общая для всех входов, а не только для SDI: «от входа» стоит и у источников, которые сами несут календарное время, — RTSP с отчётами RTCP, HLS с PROGRAM-DATE-TIME. Пока стрим не получил ни одного кадра, строки нет.

Почему таймкод не принят, говорят счётчики в Prometheus: stream_input_sdi_timecode_missing_total (пропал после привязки), …_rejected_total (не годен в время суток), …_untrusted_total (дальше 30 секунд от часов) и …_jumps_total (перепривязки). Чьё время у потока, отдаёт гейдж stream_dts_source: 1 — часы сервера, 2 — вход.

Что видно, когда что-то не так

Состояние входа видно на вкладке Источники, в блоке Здоровье источников.

Состояние SDI-источника

В блоке — статус, адрес входа вида sdi://<серийный номер>/<порт> и состав дорожек. При отказе вместо «Работает» стоит причина из таблицы ниже, и у каждой причины своё действие:

Причина Что случилось Что делать
нет сигнала на порту нет детектируемого сигнала проверить кабель и источник
порт занят драйвер отказал в порте 1) посмотреть направление порта в разделе Карты захвата: порт вывода отвечает тем же кодом; 2) проверить, не завис ли свой процесс захвата; 3) только потом искать посторонний процесс
процесс захвата недоступен исполняемый файл не найден или не запускается поставить пакет dektec-bridge
отказ устройства процесс захвата вышел ненулевым кодом без отдельного значения: неизвестный серийный номер, порт без нужной способности, отказ настройки стадию называет стартовое событие в логе
процесс не убивается не завершается ни по закрытию стандартного ввода, ни по SIGKILL признак заклинившей карты; разбираться на хосте
процесс убит извне захват убил OOM-killer, systemd или человек выяснить, кто завершил процесс, а не чинить стрим
рассинхрон версий процесс захвата шлёт данные, но медиасервер их не разбирает версии dektec-bridge и медиасервера разъехались; выкатывать их надо вместе

Неустранимых отказов здесь нет: после любой из них вход пробует подняться снова, с растущим интервалом между попытками, и поднимается сам, как только причина исчезает.

Отдельно стоит потеря сигнала на лету. Процесс захвата при этом не выходит: он продолжает выдавать кадры по расписанию, повторяя последний кадр и тишину, и для проверки живости источник с оборванным кабелем выглядит идеально здоровым. Поэтому вход, увидев устойчивое «сигнала нет», перестаёт отдавать кадры — иначе стоп-кадр уходил бы в эфир, пока кто-нибудь не вмешается. Дальше подхватывает резервный источник, а очередной ретрай поднимает захват, как только сигнал вернётся.

Панель показывает текущую причину, а не историю. Историю дают счётчики в Prometheus с префиксом stream_input_sdi_. Всегда есть:

  • состояние линии;
  • рестарты процесса захвата;
  • потери на границе процессов, с обеих сторон границы.

С лицензионной опцией «расширенные счётчики» добавляются обрезанные и неразобранные пакеты от процесса захвата и разбивка VANC.

Что модуль не делает

  • Не отдаёт сигнал в карту: это вход, а выдачи в SDI в Mcaster пока нет.
  • Не декодирует AC-3 и Dolby E в PCM.
  • Не публикует дорожку closed captions CEA-608/708.
  • Не наблюдает здоровье карты: температуру, обороты и раскладку портов показывает раздел Карты захвата.

Что дальше